STL容器的新成员,更高效的数组。

就我个人而言,原生内置数组时常感觉用起来并不十分顺手。一是大小没有管理,二是越界操作没有检查。虽然C/C++也提供了一些解决办法,但总是不够完美。例如下面的代码:

int ary[5];
memset(ary, 0, sizeof(ary));
unsigned int i = 0;
while(i<sizeof(ary)/sizeof(ary[0])){
    ary[i] = i;
    i++;
}

C++11后,标准库引入了更现代化的数组std::array。与内置数组相比,array是一种更安全、更容易使用的数组类型。与内置数组类似,array对象的大小是固定的。因此,array不支持添加和删除元素以及改变容器大小的操作。与内置数组一样,标准库array的大小也是类型的一部分。当定义一个array时,除了指定元素类型,还要指定容器大小(array<T,N> 模板定义了一种相当于标准数组的容器类型。它是一个有 N 个 T 类型元素的固定序列)。为了使用array类型,我们必须同时指定元素类型和大小。array仅仅是为普通数组添加了一些成员或全局函数,这使得数组能够被当成标准容器来使用。array不能被动态地扩展或压缩。

和标准数组相比,array 容器的额外开销很小,但提供了两个优点:1)如果使用 at(),当用一个非法的索引访问数组元素时,能够被检测到,因为容器知道它有多少个元素;2)这也就意味着数组容器可以作为参数传给函数,而不再需要单独去指定数组元素的个数。

使用 array 容器类型时,需要在源文件中包含头文件 array。下面展示了如何创建具有 10 个 double 型元素的 array<>,该实例定义了一个 array 容器,却没有为元素指定初始值,那么元素就不会被初始化:

std::array<double,10> arr;

但是可以如下所示,将它们初始化为 0 或者和默认元素类型等效的值。使用下面语句初始化后,容器中所有的元素都会变为 0.0。

std::array<double,10> arr{};

当然,当创建 array 容器的实例时,要像创建常规数组那样,对元素进行初始化:

std::array<double, 10> arr {0.5, 1.0, 1.5, 2.0};

初始化器列表中的 4 个值用于初始化前 4 个元素,其余的元素都将为 0。

回到我们最初的原生内置数组代码,我们可以利用array编写如下代码:

std::array<int, 5> c11ary;
c11ary.fill(0);
unsigned int i = 0;
while(i<c11ary.size()){
    c11ary.at(i) = i;
    i++;
}

这段代码中:

  • 使用fill方法实现了数据填充。
  • 使用size方法取得数组的大小。
  • 虽然at(i)方法实现带有越界检查的读写。