STL — array


本文原创

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;
};

未完待续…

Leave a comment

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