std::array 学习速记

简介

  • std::array 是一个封装了固定大小的数组的容器。
  • 它和有且仅有一个C风格的T[N]数组作为非static成员的struct语义上是一样的。
  • 它把标准容器的好处(比如知道自己的大小,支持赋值操作符,随机访问迭代器… ) 和C风格数组的高效率、易访问结合。除了初始化array的时候不是空的以及swap操作是线性复杂度外, std::array 满足容器和可逆容器的要求。
  • 有一种特殊的array是长度为0的array。 它有些特殊的价值, 它的begin() == end() , 并且frontback() 接口是undefined 。
  • 一个array可以被视作持有N个相同类型的元素的tuple。

功能

C style 基本功能

  • 列表初始化 : 
std::array<int , 4> array_4 = { 1, 2, 3, 4};
  • 支持 [ ] 运算符 。
    • 注意: [ ] 运算符是仍然支持越界存取的!!!
    • 注意: 越界保存的数据, 并不会出现咋data() 接口返回的底层内存中 !!!

C++11 新功能 :

  • at() 接口。

    at() 接口是安全的 [ ] 操作, 当出现数组越界的时候, 会抛出 out_of_range 异常。

  • size()max_size() 接口

    • 当前我使用的gcc (SUSE Linux) 4.8.3 这两个都是返回当前array的N值。考虑到array在构造的时候就根据N值填充, 个人认为这两个接口会一直是同一个意思。
  • empty() 接口 。

    • 注意: 和其他的容器不同,array的empty() 接口检测的是N值是否为0 。也就是说, 只有std::array 类型的array的empty() 接口才会返回true
  • data() 接口 , 返回C style的数组。

    • data()接口并没有另外开辟内存,改变其指向内存的值便改变array内数据 。
  • 视为tuple 的操作: tuple_element , tuple_size 。
  • 比较运算符们
    • 字典比较。

代码

#include 
#include 

int main()
{
    std::array ,2> a ={1} ;
    std::cout<.size()<<"\n";
    std::cout<.max_size()<<"\n";
    std::cout<.empty()<<"\n";
    a[1] = 2;
    a[2] = 3;
    std::cout<[0] <<"\n";
    std::cout<[1] <<"\n";
    std::cout<[2] <<"\n";
    a[2] = 4;
    std::cout<[2] <<"\n";
    int *p = a.data();
    std::cout<[0] <<"\n";
    std::cout<[1] <<"\n";
    std::cout<[2] <<"\n";
    p[1] =11;
    std::cout<::tuple_size(a)>::value<<"\n";
    std::cout<.at(1) <<"\n";
    std::cout<.at(2) <<"\n";
    return 0;
}

运行结果 :

2 —-> size
2 —–> max_size
0 —–>empty
1
2
3 —–>越界
4 —–>越界
1
2
-1205258896 —–>越界 , data() 接口不返回越界数据
2 —–> tuple size
11 —-> 改变data()内存,改变array。
terminate called after throwing an instance of ‘std::out_of_range’
what(): array::at
Aborted

你可能感兴趣的:(C++11)