概述
std::array
是 STL 提供的 内存连续的、固定长度 的数组数据结构。只允许访问或者替换存储的元素。其本质是对原生数组的直接封装。
array
相比 vector
牺牲了动态扩容的特性,但是换来了与原生数组几乎一致的性能(在开满优化的前提下)。
因此如果能使用 C++11
特性的情况下,能够使用原生数组的地方几乎都可以直接把定长数组都换成 array,而动态分配的数组可以替换为 vector。
声明与初始化
template<
class T,
std::size_t N
> struct array; //C++11
std::array
是一个聚合类型,其语义等同于保有一个C语言风格数组T[N]
作为其唯一非静态数据成员的结构体,但其不同于C数组的是它不会自动退化为T*
。同时该结构体结合了C风格数组的性能、可访问性和容器的优点(可获取大小、支持赋值和随机访问等)。
基础数据类型
//声明一个大小为100的`int`型数组,元素的值不确定
array<int, 100> a;
//声明一个大小为100的int型数组,初始值均为0初始值与默认元素类型等效
array<int, 100> a{
};
//声明一个大小为100的int型数组,初始化部分值,其余全部为0
array<int, 100> a{
1, 2, 3};
//或者可以用等号
array<int, 100> a = {
1, 2, 3};
高级数据类型
不同于原生数组的是对元素类型不做要求,可以套结构体
array<string, 2> s = {
"ha", string("haha")};
array<node, 2> a;
方法函数
方法 | 含义 |
---|---|
长度/容量 | |
size() |
返回当前array中元素的数量。 O(1) |
empty() |
检查当前array是否为空。如果为空,返回true;否则返回false。 O(1) |
max_size() |
返回array容器的最大可能长度。 |
访问元素 | |
at(pos) |
返回容器中下标为 pos 的引用。如果数组越界抛出 std::out_of_range 类型的异常。O(1) |
operator[pos] |
访问指定的元素,不进行越界检查 |
front() |
返回首元素的引用。O(1) |
back() |
返回末尾元素的引用。O(1) |
data() |
返回指向数组第一个元素的指针。 |
修改器 | |
fill(value) |
用于以指定值填充容器,即将定值 value 赋给容器中的所有元素 |
swap(array) |
交换两个array容器的内容 |
迭代器 | |
begin() / cbegin() |
返回指向首元素的迭代器(地址),其中 *begin = front |
end() / cend() |
返回指向数组尾端占位符的迭代器,注意是没有元素的。 |
rbegin() / crbegin() |
返回指向逆向数组的首元素的逆向迭代器,可以理解为正向容器的末元素。*rbegin = back |
rend() / crend() |
返回指向逆向数组末元素后一位置的迭代器,对应容器首的前一个位置,没有元素。 |
含有字符 c 的为只读迭代器,你不能通过只读迭代器去修改容器中的元素的值。如果一个容器本身就是只读的,那么它的一般迭代器和只读迭代器完全等价。只读迭代器自 C++11 开始支持。
存取元素
-
at()
访问//at()函数的原型: reference at( size_type pos ); //C++17 前 constexpr reference at( size_type pos ); //C++17 起 const_reference at( size_type pos ) const; //C++14 前 constexpr const_reference at( size_type pos ) const; //C++14 起
at()
函数返回指定位置pos处的元素的引用。如果pos超出了有效范围(即大于等于size()),则抛出std::out_of_range异常。std::array<int,3> data = { 1, 2, 3}; std::cout<<data.at(1)<<std::endl; //2 data.at(1)=8; //此时data={1, 8, 3} data.at(6) = 6; //越界,抛出std::out_of_range异常
-
下标访问
//operator[] 函数的原型: reference operator[]( size_type pos ); //C++17 前 constexpr reference operator[]( size_type pos ); //C++17 起 const_reference operator[]( size_type pos ) const; //C++14 前 constexpr const_reference operator[]( size_type pos ) const; //C++14 起
operator[]
返回指定位置pos处的元素的引用。与at()
函数不同的是,若pos超出有效范围,则行为是未定义的。也就是说at越界时会抛出异常,而[]越界不会抛出异常。std::array<</