背景
上一篇文章我们介绍了C++中的迭代器,这篇文章将会介绍C++中数组的概念,数组是一种和vector类似的数据结构,但是其在性能和灵活性上的权衡中选择了性能而放弃了一定的灵活性,其与vector相同的地方是,它们都是同一类型的对象的容器,也都可以通过下标访问。其不同点是数组的大小是固定的,所以无法向一个数组添加元素,也正是因为其大小固定,所以其在运行时有更好的性能。
定义和初始化数组
数组是一个复合类型,可以通过类似a[d]的形式定义,其中a是数组名,d是数组的容量,d必须要大于0,数组的容量是数组类型的一部分,其导致数组容量必须要在编译时就已知,这要求数组容量必须是常量表达式,以下提供了数组声明的几种形式:
unsigned cnt = 42; //不是一个常量表达式
constexpr unsigned sz = 42; //是常量表达式
int arr[10]; //声明一个容量为10的整型数组
int *parr[sz]; //42个指向整形指针的数组
string bad[cnt]; //这是个错误声明,因为cnt不是常量表达式
默认情况下,数组里面的元素都会被默认初始化。
我们可以通过列表初始化一个数组,通过这种方式我们在定义时可以忽略数组的容量,如果我们指定了数组容量,那么在列表初始化时初始化的元素数量不能超过设置的容量值,如果少于设置的数组的数量,没有指定值的元素会使用默认初始化的值,例子如下:
const unsigned sz = 3;
int a1[sz] = {0, 1, 2};
int a2[] = {0, 1, 2}; //可以忽略数组的容量
int a3[5] = {0, 1, 2}; //等价于{0, 1, 2, 0, 0}
string a4[3] = {
"hi", "bye"}; //等价于{