本文原创
array 类是 C++11 新增的容器,其类似于内置的数组,没有显示的构造函数,使用初始化列表进行初始化,但是其 size 不是根据初始化列表的元素个数所决定,而是取决于第二个模板参数,而且 array 对象可以拷贝、移动、赋值。在 VS 使用的 STL 版本中,其原型如下:
template<class _Ty, size_t _Size> class array { public: enum {_EEN_SIZE = _Size}; // helper for expression evaluator typedef array<_Ty, _Size> _Myt; ...... _Ty *data() _NOEXCEPT // return pointer to mutable data array { return (_Elems); } __declspec(noreturn) void _Xran() const // report an out_of_range error { _Xout_of_range("invalid array<T, N> subscript"); } _Ty _Elems[_Size == 0 ? 1 : _Size]; };
可以看出,array 的第二个模板参数为非类型参数,且为整型常值,从而在程序创建的时候,编译器或链接器就能够确定实参的值,因此内部的数组 _Elems 能够顺利初始化。这里还针对 _Size 为0的特殊情况作了局部特化:
template<class _Ty> class array<_Ty, 0> { // zero size array of values public: enum {_EEN_SIZE = 0}; // helper for expression evaluator typedef array<_Ty, 0> _Myt; ...... _Ty _Elems[1]; };
array 同 STL 的其他容器一样,提供了四种迭代器,此外提供了越界检查的 at()方法,重载了无越界检查的 [] 运算符,后者操作和数组完全一致。
#include <iostream> #include <array> using namespace std; int main(void) { array<int, 12> arr1 = { 65, 75, 28, 99, 29, 80, 38, 35, 59, 30, 63, 69 }; array<int, 12> arr2 = { 73, 29, 55, 23, 51, 70, 54, 87, 13, 65, 34, 64 }; array<int, 12>::iterator ita; cout << arr1.at(3) << ' ' << arr2[9] << endl; arr1.swap(arr2); sort(arr1.begin(), arr1.end()); for (ita = arr1.begin(); ita != arr1.end(); ++ita) cout << *ita << ' '; cout << endl; for (ita = arr2.begin(); ita != arr2.end(); ++ita) cout << *ita << ' '; cout << endl; return 0; };
未完待续…