深蓝学院C++基础与深度解析笔记 第 3 章 数组、 vector 与字符串

news2024/11/25 14:54:48

第 3 章 数组、 vector 与字符串

一、数组

将一到多个相同类型的对象串连到一起,所组成的类型
int a → int b[10] b的类型是int[10];
A、 数组的初始化方式:
● 缺省初始化
● 聚合初始化( aggregate initialization )

 int b[3]  = {1, 2, 3};
 int b[3]  = {1, 2};
 int b[]   = {1, 23};

● 注意事项

  • 系统将会默认用0初始化未初始化的值
  • 不能使用 auto 来声明数组类型、
  • 数组不能复制,不能使用数组初始化数组
  • 元素个数必须是一个常量表达式(编译期可计算的值)
  • 字符串数组的特殊性,长度+1(’\n‘)
  • 数组长度不可变,需要大于0;

B、 数组的复杂声明

  • 指针数组与数组的指针
  • 声明数组的引用
  • 声明可以不给出长度
int* a[3];       // 有三个int指针的数组
int (*a)[3]      // 指向三个元素的数组的指针

int (&a)[3]      // 数组的引用  

不能定义引用的数组(这样做数组的元素将会称为对象别名,但是数组中的对象不能是别名 )

C、数组中的元素访问

  • 数组对象是一个左值
  • 使用时通常会转换成相应的指针类型
  • x[y] → *((x) + (y))
int a[3]={1,2,3};
std::cout << *(a + 1) << std::endl; 
std::cout << 1[a] << std::endl; 
 //输出都是 2 ,本质都是先转化成指针再解引用

小心数组上下界的溢出!!!

D、数组到指针的隐式转换

  • 使用数组对象时,通常情况下会产生数组到指针的隐式转换
  • 隐式转换会丢失一部分类型信息
  • 可以通过声明引用来避免隐式转换
  • 注意:不要使用 extern 指针来声明数组,长度可能需要更改, 类型信息也会被丢掉
  • Unknown Bounded Array 声明

● 获得指向数组开头与结尾的指针 : std::( c )begin, std::( c )endc: const
● 指针算数:

  • 增加、减少
  • 比较:只建议比较一个数组中的两个指针
  • 求距离:和指针类型相关
  • 解引用
  • 指针索引

● 求元素的个数

  • sizeof 方法,需要 / 类型 , 比较危险
  • std::size 方法
  • (c )end - (c )begin 方法,运行期获取的方法

● 元素遍历
– 基于元素个数
– 基于 (c )begin/(c )end
– 基于 range-based for 循环

E、 C 字符串
● C 字符串本质上也是数组
● C 语言提供了额外的函数来支持 C 字符串相关的操作 : strlen, strcmp…
'\n’为最后一个字符,表示结束

F、多维数组
● 本质:数组的数组,套娃!
– int a[3][4]:只能省略一个
● 多维数组的聚合初始化:一层大括号 V.S. 多层大括号
● 多维数组的索引与遍历

– 使用多个中括号来索引
– 使用多重循环来遍历:行遍历优于列遍历

● 指针与多维数组

– 多维数组可以隐式转换为指针,但只有最高维会进行转换,其它维度的信息会被保留,会丢掉最高位信息
– 使用类型别名来简化多维数组指针的声明
– 使用指针来遍历多维数组

未初始化的元素会被自动初始化为0
只有最后一层遍历时候可以省略 &

二、vector 序列容器

vector 是 C++ 标准库中定义的一个类模板
● 与内建数组相比,更侧重于易用性
可复制、可在运行期动态改变元素个数
性能降低
● 构造与初始化

  • 聚合初始化
  • 其它的初始化方式

● 其它方法

  • 获取元素个数size()、判断是否为空empty()
  • 插入push_back()、删除元素pop_back()
  • vector 的比较:每个元素挨个比较

● vector 中元素的索引与遍历:

  • [] V.S. at
  • ( c ) begin / ( c )end 函数 V.S. ( c )begin / ( c )end 方法

● 迭代器

  • 模拟指针的行为
  • 包含多种类别,每种类别支持的操作不同

● vector 对应随机访问迭代器
● 解引用与下标访问
● 移动
● 两个迭代器相减求距离
● 两个迭代器比较

● vector 相关的其它内容

  • 添加、删除元素可能使迭代器失效
  • 多维 vector
  • 从 . 到 -> 操作符:(*ptr). == ptr ->
  • vector 内部定义的类型
size_type
iterator / const_iterator

三、string

● string是 C++ 标准库中定义的一个类模板特化别名,用于内建字符串的代替品
● 与内建字符串相比,更侧重于易用性
– 可复制、可在运行期动态改变字符个数
● 构造与初始化 = 或者 ()
● 其它方法

- 尺寸相关方法( `size() / empty()` )
– 比较
– 赋值 ` = ` 
– 拼接 `+`
– 索引 :通过下标索引 `[ ]`
– 转换为 C 字符串:  `s.c_str();`返回char*指针。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/647998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ansible的部署和命令模块和playbooks剧本

系列文章目录 文章目录 系列文章目录一、Ansible1、Ansible简介2、Ansible特点及优势3、Ansible核心程序4、Ansible工作原理及流程5.部署Ansible自动化运维工具6、Ansible常用模块 二、playbooks剧本1.playbooks2、playbooks组成部分3、playbooks启动及检测 总结 一、Ansible …

简单的TCP网络程序·多进程、多线程(后端服务器)

前文链接 -- 简单的TCP网络程序单进程 上篇文章中&#xff0c;实现了TCP网络通信的的单进程版本&#xff0c;因为实现的是一个死循环的逻辑&#xff0c;是串行实运行的&#xff0c;显然这和实际中的TCP通信是不同的&#xff0c;为了解决这方面的问题&#xff0c;需要使用多进程…

B+树:MySQL数据库索引的实现

作为一个软件开发工程师&#xff0c;你对数据库肯定再熟悉不过了。作为主流的数据存储系统&#xff0c;它在我们的业务开发中&#xff0c;有着举足轻重的地位。在工作中&#xff0c;为了加速数据库中数据的查找速度&#xff0c;我们常用的处理思路是&#xff0c;对表中数据创建…

chatgpt赋能python:Python怎么横着输出?

Python怎么横着输出&#xff1f; 如果你是一名有10年Python编程经验的工程师&#xff0c;你一定已经经历过许多项目&#xff0c;很可能你曾经需要对代码进行一些横向格式化或输出。Python作为一种高级编程语言&#xff0c;有各种各样的技巧和技能。在本文中&#xff0c;我们将…

node安装后的全局环境变量配置

安装node时&#xff0c;位置最好不要装在c盘&#xff0c;这里&#xff0c;我在D盘下创建了文件夹"node"&#xff0c;安装地址选择在该文件夹下 一直next&#xff0c;直到安装结束&#xff0c;打开"node"文件夹&#xff0c;安装完后&#xff0c;里面的配置…

C++【STL】之vector的使用

文章目录&#xff1a; vector介绍vector使用1. 默认成员函数1.1 默认构造1.2 拷贝构造1.3 析构函数1.4 赋值重载 2. 迭代器2.1 正向迭代器2.2 反向迭代器 3. 容量操作3.1 获取空间数据3.2 空间扩容3.3 大小调整3.4 空间缩容 4. 数据访问4.1 下标随机访问4.2 获取首尾元素 5. 数…

chatgpt赋能python:Python怎么横向键盘输入?

Python怎么横向键盘输入&#xff1f; 如果你是一位使用Python进行编程的工程师&#xff0c;你肯定明白快速而准确地输入代码的重要性。现在&#xff0c;许多程序员都找到了一个方法来更快地输入代码-横向键盘输入。 什么是横向键盘输入&#xff1f; 横向键盘输入是一种方法&…

基于Java校园驿站管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

力扣题库刷题笔记5--最长回文子串

1、题目如下&#xff1a; 2、个人Python代码实现&#xff1a; 首先想到的是通过类似冒泡排序的方式进行切片&#xff0c;然后判断切片的子字符串是否为回文字符串&#xff0c;然后记录出最长的回文字符串&#xff0c;代码如下&#xff1a; 可以看到&#xff0c;通过切片的方式&…

合宙Air724UG Cat.1模块硬件设计指南--电源供电

电源供电 简介 在模块应用设计中&#xff0c;电源设计是很重要的一部分&#xff0c;供电部分的电路设计不当会造成模块出现工作异常、指标恶化等现象&#xff0c;而良好的电源设计方案能够给模块提供稳定的工作状态。 特性 模块主供电VBAT&#xff1a;3.3V~4.3V&#xff0c;推…

设计模式—模板方法模式

模板方法模式&#xff1a; 定义一个操作的流程框架&#xff0c;而将流程中一些步骤延迟到子类中实现。使得子类在不改变流程结构的情况下&#xff0c;重新定义流程中的特定步骤。 主要角色&#xff1a; 抽象类: 负责给出操作流程的轮廓或框架&#xff0c;由模板方法和若干基…

用户模块的增删改查接口设计

MongoDB 数据库常用操作 MongoDB数据库中常用的操作包括&#xff1a; 插入数据&#xff1a;使用insertOne()或insertMany()方法向集合中插入数据。查询数据&#xff1a;使用find()方法查询满足条件的数据。更新数据&#xff1a;使用updateOne()或updateMany()方法更新满足条件…

【力扣刷题 | 第九天】150 逆波兰 239滑动窗口最大值

目录 前言&#xff1a; 150. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 本片仍然是利用栈与队列的思想来解决实际问题&#xff0c;希望各位小伙伴可以和我…

chatgpt赋能python:Python断言之等于两个值其中一个

Python断言之等于两个值其中一个 在Python编程中&#xff0c;我们经常需要对程序进行断言&#xff0c;以判断程序是否正确地运行。其中一种常见的断言方式是判断某个方法的结果是否等于两个值中的其中一个。本文将介绍如何在Python中实现这种断言&#xff0c;并探讨其在实际应…

⑨电子产品拆解分析-触摸化妆镜

⑨电子产品拆解分析-触摸化妆镜 一、功能介绍二、电路分析以及器件作用1、电源部分2、触摸部分3、灯光控制部分三、数据手册以及其它资料1、注意点2、数据手册汇总一、功能介绍 ①短按白光、暖光、冷光三档色温切换;②长按支持无极调光;③三档调亮度关机记忆当前亮度功能;二…

chatgpt赋能python:Python模块更新技巧详解

Python模块更新技巧详解 为什么需要更新Python模块&#xff1f; Python语言自问世以来一直在得到广泛的应用&#xff0c;其中最大的原因在于它的灵活性和可扩展性。Python拥有丰富的模块库&#xff0c;覆盖了各种不同的应用场景。然而&#xff0c;由于软件环境不断发展&#…

服务器配置远程vscode

1 使用sftp同步远程代码 打开vscode&#xff0c;在扩展种搜索sftp&#xff0c;点击安装。   按住快捷键shiftctrlp&#xff0c;可以打开界面顶部的命令行&#xff0c;输入sftp&#xff0c;点击如下图的config选项&#xff1a;   会自动在.vscode目录下创建一个名为sftp.j…

photoscan(metashape)跑GPS辅助的无人机影像SfM(空三)教程

刚打开的photoscan界面如下图所示&#xff1a;   然后&#xff0c;点击工作区左上角的添加堆块选项&#xff1a;   可以看到新增了一个名为“Chunk 1”的堆块&#xff0c;然后&#xff0c;右击“Chunk 1”&#xff0c;依次选择add、添加照片&#xff1a;   即可弹出照…

踩坑系列 Spring websocket并发发送消息异常

文章目录 示例代码WebSocketConfig配置代码握手拦截器代码业务处理器代码 问题复现原因分析解决方案方案一 加锁同步发送方案二 使用ConcurrentWebSocketSessionDecorator方案三 自研事件驱动队列&#xff08;借鉴 Tomcat&#xff09; 总结 今天刚刚经历了一个坑&#xff0c;非…

云原生之使用Docker部署wordpress网站

云原生之使用Docker部署wordpress网站 一、wordpress介绍二、检查本地docker环境1.检查docker状态2.检查docker版本 三、下载wordpress镜像四、创建数据库1.创建数据目录2.创建mysql数据库容器3.查看mysql容器状态4.远程客户端测试连接数据库 五、部署wordpress1.创建wordpress…