array是一个固定大小的序列容器,和vector相似,它使用连续的空间来保存元素。不同的是,它只能在定义的时候指定大小,而不能通过其它方式修改大小。除了保存的数据元素外,array中不保存任何数据(vector需要指针来保存其分配的空间的地址等信息)。

array是一个类模板,它有两个模板参数,其中一个表明需要保存的元素的类型,另一个表明需要保存的元素的数量。由于这个模板类是在C++11标准加入的,所以使用时需要支持C++11的编译器来编译。

迭代器

  1. begin() 返回第一个元素的迭代器;
  2. end() 返回最后一个元素后面的迭代器(而不是最后一个元素);
  3. rbegin() 返回最后一个元素的反向迭代器;
  4. rend() 返回第一个元素前面的迭代器;
  5. cbegin()、cend()、crbegin()、crend() 表示对应的常量(const)迭代器。

容量相关

  1. size_type size() 返回容器中元素的个数;
  2. size_type max_size() 返回容器可以容纳的最大元素的个数,与size相同;
  3. bool empty() 若容器中元素个数为0则返回真,否则返回假。

这些函数的返回值在编译时就已经根据第二个模板参数确定了。

元素访问

  1. operator[](size_type i) 返回第i个元素的引用;
  2. at(size_type i) 返回第i个元素的引用;
  3. front() 返回第一个元素的引用;
  4. back() 返回最后一个元素的引用;
  5. data() 返回指向第一个元素的指针。

更新容器

  1. fill(value_type val) 使用val填充数组;
  2. swap(array &x) 交换两个(相同类型和大小的)array的内容,它等价于交换所有对应元素,因此时间复杂度为线性。
#include <iostream>
#include <array>
using std::array;
using std::cout;
using std::endl;
 
int main()
{
    array<int, 3> x = {1, 2, 3};
    array<int, 3> y = {4, 5, 6};
    x[0] = y[0];
    x.back() = y.at(1);
    x.at(1) = y.back();
    x.swap(y);
    y.fill(0);
    array<int, 3>::iterator it;
    for(it = x.begin(); it != x.end(); ++it)
        cout << *it << ' ';
    cout << endl;
    for(it = y.begin(); it != y.end(); ++it)
        cout << *it << ' ';
    cout << endl;
    return 0;
}
/*
4 5 6 
0 0 0 
*/

总结

相对于vector来说,array失去了改变大小的灵活性,但由于它不保存额外信息,使得它有较高的存储效率。实际上,可以直接把它当作数组来使用,但数组无法在函数间传递,而array可以。

需要时刻注意的是,array的swap和赋值会逐个拷贝其中的元素,因此大量拷贝array类型的数据可能会耗费很多的时间。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注