array是一个固定大小的序列容器,和vector相似,它使用连续的空间来保存元素。不同的是,它只能在定义的时候指定大小,而不能通过其它方式修改大小。除了保存的数据元素外,array中不保存任何数据(vector需要指针来保存其分配的空间的地址等信息)。
array是一个类模板,它有两个模板参数,其中一个表明需要保存的元素的类型,另一个表明需要保存的元素的数量。由于这个模板类是在C++11标准加入的,所以使用时需要支持C++11的编译器来编译。
迭代器
- begin() 返回第一个元素的迭代器;
- end() 返回最后一个元素后面的迭代器(而不是最后一个元素);
- rbegin() 返回最后一个元素的反向迭代器;
- rend() 返回第一个元素前面的迭代器;
- cbegin()、cend()、crbegin()、crend() 表示对应的常量(const)迭代器。
容量相关
- size_type size() 返回容器中元素的个数;
- size_type max_size() 返回容器可以容纳的最大元素的个数,与size相同;
- bool empty() 若容器中元素个数为0则返回真,否则返回假。
这些函数的返回值在编译时就已经根据第二个模板参数确定了。
元素访问
- operator[](size_type i) 返回第i个元素的引用;
- at(size_type i) 返回第i个元素的引用;
- front() 返回第一个元素的引用;
- back() 返回最后一个元素的引用;
- data() 返回指向第一个元素的指针。
更新容器
- fill(value_type val) 使用val填充数组;
- 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类型的数据可能会耗费很多的时间。
本文由kedixa发表于个人博客,
转载请注明作者及出处。
本文链接:https://blog.kedixa.top/2016/cpp-container-array/