简介
- std::array 是一个封装了固定大小的数组的容器。
- 它和有且仅有一个C风格的T[N]数组作为非static成员的struct语义上是一样的。
- 它把标准容器的好处(比如知道自己的大小,支持赋值操作符,随机访问迭代器… ) 和C风格数组的高效率、易访问结合。除了初始化array的时候不是空的以及swap操作是线性复杂度外, std::array 满足容器和可逆容器的要求。
- 有一种特殊的array是长度为0的array。 它有些特殊的价值, 它的
begin() == end()
, 并且front
和back()
接口是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<T, 0>
类型的array的empty()
接口才会返回true
。
- 注意: 和其他的容器不同,array的
data()
接口 , 返回C style的数组。data()
接口并没有另外开辟内存,改变其指向内存的值便改变array内数据 。
- 视为tuple 的操作: tuple_element , tuple_size 。
- 比较运算符们
- 字典比较。
代码
#include <iostream>
#include <array>
int main()
{
std::array<int ,2> a ={1} ;
std::cout<<a.size()<<"\n";
std::cout<<a.max_size()<<"\n";
std::cout<<a.empty()<<"\n";
a[1] = 2;
a[2] = 3;
std::cout<<a[0] <<"\n";
std::cout<<a[1] <<"\n";
std::cout<<a[2] <<"\n";
a[2] = 4;
std::cout<<a[2] <<"\n";
int *p = a.data();
std::cout<<p[0] <<"\n";
std::cout<<p[1] <<"\n";
std::cout<<p[2] <<"\n";
p[1] =11;
std::cout<<std::tuple_size<decltype(a)>::value<<"\n";
std::cout<<a.at(1) <<"\n";
std::cout<<a.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