第 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, 2,3};
● 注意事项
- 系统将会默认用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 )end
,c: 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*指针。