数组
-
定义与初始化
-
定义
数组是复合类型,包含数组名和数组维度
其中数组维度必须是常量表达式
不允许使用 auto 关键字来推断数组的类型 -
初始化
指明维度,初始值的总数量就不应该超过维度,若还有剩,则剩下的使用默认初始值
不指明维度,维度大小由列表初始值数量确定 -
字符数组
若用字符串字面值(非 string 对象)初始化字符数组,则字符数组会多占用一个位置放’\0’,这也是 C 风格的字符串 -
复杂的数组声明
int *ptrs[10];//ptrs是含有是个整型指针的数组 int (*Parray)[10] = &arr;//Parray指向一个含有10个整数的数组,定义数组的指针 int (&arrRef)[10] = arr;//arrRef是含有10个整数数组的引用 int *(&array)[10] = ptrs;//array是含有10个整数指针数组的引用
先读括号,然后从数组名字开始从内向外读
-
-
访问数组元素
数组除了大小固定之外,其他用法与 vector 类似
范围 for 可以实现数组遍历,使用范围 for 是因为系统知道数组的维度(维度属于数组类型的一部分)
使用普通for循环时,下标的范围由程序员自行检查 -
指针与数组
数组名字就是指向数组首元素的指针-
指针也是迭代器
通过数组名字得到指向首元素的指针
通过&arr[size]
得到尾后元素的指针 -
begin 和 end 函数(iterator 头文件中)
begin 返回数组的首元素指针
end 返回数组的尾后元素指针void test() { int arr[] = {1, 2, 3, 4, 5, 6}; auto beg = begin(arr); auto e = end(arr); while (beg != e) { cout << *beg++ << endl; } }
-
-
数组初始化 vector 对象
vector<int> ivec(begin(arr), end(arr));
不包含end(arr)
位置上的值,也可以用部分值来初始化 vector 对象尽可能使用 vector 和迭代器,避免使用数组和指针;使用 string 对象,避免使用字符数组
-
多维数组
- 初始化
- 下标引用搭配普通 for 循环
- 范围 for 循环
for(auto &row : arr) for(auto &col : row)
使用 auto 关键字可以让编译器为我们推断类型
使用范围 for 循环把管理数组索引的任务交给系统
使用范围 for 循环时,除了最内层的循环外,其他循环都应该是引用类型(避免编译器将数组形式的元素转换为指向该数组内首元素的指针)