STL之array

  • 头文件及声明:
    1
    2
    3
    4
    5
    6
    7
    8
    #include <array>


    namespace std
    {
    template <typename T, size_t N>
    class array;
    }
  • 初始化:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /*
    使用默认构造函数初始化,对于内部类型来说值是一个不确定的值。如下:arr中的值均无法确定。
    */

    std::array<int, 4> arr;

    /*
    我们可以给构造函数传一个空的初始化列表,这样可以保证容器内的值被初始化,内部类型初始化为0。若是初始化列表里面的数不够,剩下 的也会被初始化为0,若是数多于指定的数,则会报错,对于无法确定有多少个数字的时候我们可以不指定N的大小。
    */

    std::array<int, 4> arr1 = { };
    std::array<int, 4> arr2 = { 1, 2 };//剩下的值初始化为0
    std::array<int, 4> arr3 = { 1, 2, 3, 4, 5 };//错误,值太多
    std::array<int> arr4 = { 1, 2, 3, 4 };
  • size

    1
    2
    3
    /*
    可以定义一个N为0的数组,相关迭代器都可以使用,但是front()和back()无法使用
    */

  • array的创建,拷贝与销毁
  • 无修改的操作

c.empty()
c.size()
c.max_size() 返回最大能够存储的值的数目
c1 op c2 各种比较的操作

  • 赋值操作

c = c2
c = rv
c.fill(val) 所有的元素都用val初始化
c1.swap(c2)
swap(c1, c2) 注意此处的时间复杂度并非常数时间,而是线性

  • 元素的存取

c[idx]
c.at(idx)
c.front()
c.back()
注意这里面仅仅c.at(idx)会检查是否越界并抛出异常,其他的属于未定义的行为。

  • 迭代器

array是存储在一片连续的内存中间,因此可以像c数组一样使用,data()函数返回一个指向这片区域的指针。如下所示:

1
2
3
std::array<char, 100> a;
strcpy(a.data(), "hello world");
printf("%s\n", a.data());