开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
数组
数组和vector
-
相同点
- 存放的都是相同类型的对象
- 通过下标访问数组内对象
-
不同点
vector
大小可变;数组大小在初始化时就确定不变,不能随意向数组增加元素
初始化数组
-
数组声明形式:
a[d]
a
是数组名
d
是数组的大小,编译时就必须已知的,也就说长度必须是一个常量表达式
- 数组定义时,数组元素会执行默认初始化
- 定义数组时必须明确指定类型,不能使用
auto
- 数组的元素必须是对象,因此不存在引用的数组
-
显示初始化数组
const unsigned sz = 3; int a1[sz]; //执行默认初始化,数组元素默认初始化0 int a2[sz] = {1,2,3}; //含有3个元素的数组,分别初始化为1,,2,,3 int a3[] = {1,2,3}; //根据初始值数量推断出长度是3 int a4[5] = {1,2,3}; //数组长度是5,前3个元素是1,2,,3,后面元素都初始化为0 int a5[2] ={1,2,3};//元素数量超过了数组定义的长度,错误
-
数组不允许拷贝,不能将一个数组拷贝给另一个数组
int a[] = {1,2,3}; int a2[] = a;//错误,不能使用数组初始化另一个数组 a2 = a;//错误,不能直接赋值
数组元素访问
- 使用下标访问数组元素,即
a[index]
形式,和string
或者vector
访问是类似的
- 使用指针访问,详细见数组和指针的文章
- 使用迭代器访问
-
数组本身没有迭代器对象,标准库提供了两个函数获取数组迭代器,即
begin()
和end()
,存在iterator
头文件中include <iterator> int a[] = {1,2,3} int *beg = begin(a); //指向首元素的指针 int *end = end(a); //指向数组的尾后指针
获取到迭代器后也可以类似vector遍历数组了
和迭代器一样,这两个指针相减结果是他们之间的距离。类型是ptrdiff_t
类型,一种带符号类型
多维数组
理解多维数组
- 多维数组就是数组的数组。可以理解为一个数组的元素还是一个数组
- 当一个数组的元素仍然是数组时,通常使用两个维度来定义它:一个维度表示数组本身大小,另外一个维度表示其元素(也是数组)大小
- 形式:
a[x][y]
; 即a是大小为x
的数组,数组中每个元素都是数组,大小是y
常用的是二维数组,这时x称为行,y称为列
多维数组初始化
//使用{}初始化一维数组,再每一个元素都是用{}进行初始化
int a3[3][4] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
//不嵌套{}初始化也是可以的,本质上多维数组在内存中的排列也是线性的
int a2[3][4]={0,1,2,3,4,5,6,7,8,9,10.11};
//初始化二维数组的每行的首元素
int a3[3][4] = { {0}, {4}, {8} };
//初始化二维数组的第一行,其他都是默认初始化
int a3[3][4] = {0,1,2,3};
数组访问
- 使用双层for循环
- 也可以转化为数组访问,详细见数组和指针多维数组部分