std::array - C++容器库
在头文件中定义
模板:
template< class T, std::size_t N > struct array;
自C++11开始有的。
简介
std::array是一个封装固定大小数组的容器。
这种容器型别其语义与只含有一笔以T[N]表示之C风格阵列做为它唯一非静态数据成员之struct相同。和C-style 数组不同的地方在于它不会自动衰减至类型T*。作为聚集类别,可以使用最多N个可转换为T的初始化值进行聚合初始化:std::array a = {1,2,3};
.
此结构体兼具了C-style数组性能高、访问速度快等特点,并且添加了标准化存储器所包含诸如知道本身大小、支援赋值、正逆序迭代器等优点(但交换时复杂度呈现线性),满足Container 和 ReversibleContainer需求,除了默认建立构造函数并没有为空外(从C++17开始)其实满足 ContiguousContainer 的要求且满足部分 SequenceContainer需要。
对于零长度数组(即: N == 0)则有特殊处理方式,在这种情况下,array.begin() == array.end(),返回一个独特值.如果试图调用空数组的 front() 或 back(),结果是未定义行为.
Array还可以用作包含N个元素相同类型的元组.
迭代器失效:
作为一般规则,数组的迭代器在数组的生命周期内永远不会失效。然而,需要注意的是,在交换过程中,迭代器将继续指向相同的数组元素,因此它的值将会改变。
成员类型:
成员类型 | 定义 |
value_type | T |
size_type | std::size_t |
difference_type | std::ptrdiff_t |
reference | value_type& |
const_reference | const value_type& |
pointer | value_type* |
const_pointer | const value_type* |
iterator | 根据 C++ 版本,迭代器可能是 LegacyRandomAccessIterator,LegacyContiguousIterator 或 ConstexprIterator,指向 value_type |
const_iterator | 根据 C++ 版本,迭代器可能是 LegacyRandomAccessIterator,LegacyContiguousIterator 或 ConstexprIterator,指向 const value_type |
reverse_iterator | std::reverse_iterator |
const_reverse_iterator | std::reverse_iterator<const_iterator> |
成员函数:
成员函数 | 定义 |
构造函数 | 按照聚合初始化的规则初始化数组 |
析构函数 | 销毁数组的每一个元素 |
operator= | 用另一个数组的对应元素覆盖数组的每一个元素 |
at | 访问指定元素并进行边界检查 |
operator[] | 访问指定元素 |
front | 访问第一个元素 |
back | 访问最后一个元素 |
data | 直接访问底层数组 |
begin/cbegin | 返回指向开始的迭代器 |
end/cend | 返回指向结束的迭代器 |
rbegin/crbegin | 返回指向开始的反向迭代器 |
rend/crend | 返回指向结束的反向迭代器 |
empty | 检查容器是否为空 |
size | 返回元素的数量 |
max_size | 返回可能的最大元素数量 |
fill | 用指定值填充容器 |
swap | 交换内容 |
非成员函数:
非成员函数 | 定义 |
operator==, operator!=, operator<, operator<=, operator>, operator>=, operator<=> | 在数组中进行词法比较 |
std::get(std::array) | 访问数组的一个元素 |
std::swap(std::array) | 特殊的 std::swap 算法 |
to_array | 从内建数组创建一个 std::array 对象 |
辅助类:
辅助类 | 定义 |
std::tuple_sizestd::array | 获取数组的大小 |
std::tuple_elementstd::array | 获取数组元素的类型 |
推断引导:
C++17以后的版本提供了推断引导。
示例:
以下示例应塞入代码段内:
#include <algorithm> #include <array> #include <iostream> #include <iterator> #include <string> int main() { #include <algorithm> #include <array> #include <iostream> #include <iterator> #include <string> int main() { // construction uses aggregate initialization std::array<int, 3> a1{{1, 2, 3}}; // double-braces required in C++11 prior to // the CWG 1270 revision (not needed in C++11 // after the revision and in C++14 and beyond) std::array<int, 3> a2 = {1, 2, 3}; // double braces never required after = std::array<std::string, 2> a3 = { std::string("a"), "b" }; // container operations are supported std::sort(a1.begin(), a1.end()); std::reverse_copy(a2.begin(), a2.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; // ranged for loop is supported for (const auto& s: a3) std::cout << s << ' '; // deduction guide for array creation (since C++17) [[maybe_unused]] std::array a4{3.0, 1.0, 4.0}; // -> std::array<double, 3> }
Output:
3 2 1
a b