std::array
定义于头文件 <array>
|
||
template< class T, |
(C++11 起) | |
std::array
是封装固定大小数组的容器。
此容器是一个聚合类型,其语义等同于保有一个 C 风格数组 T[N] 作为其唯一非静态数据成员的结构体。不同于 C 风格数组,它不会自动退化成 T* 。它能作为聚合类型聚合初始化,只要有至多 N
个能转换成 T
的初始化器: std::array<int, 3> a = {1,2,3}; 。
该结构体结合了 C 风格数组的性能、可访问性与容器的优点,比如可获取大小、支持赋值、随机访问迭代器等。
std::array
满足容器 (Container) 和可逆容器 (ReversibleContainer) 的要求,除了默认构造的 array 是非空的,以及进行交换的复杂度是线性,它满足连续容器 (ContiguousContainer) (C++17 起)的要求并部分满足序列容器 (SequenceContainer) 的要求。
当其长度为零时 array
( N == 0
)有特殊情况。此时, array.begin() == array.end() ,并拥有某个唯一值。在零长 array
上调用 front() 或 back() 是未定义的。
亦可将 array
当做拥有 N
个同类型元素的元组。
迭代器非法化
按照规则,指向 array
的迭代器在 array
的生存期间决不非法化。然而要注意,在 swap 时,迭代器将继续指向同一 array
的元素,并将改变元素的值。
成员类型
成员类型 | 定义 |
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
|
遗留随机访问迭代器 (LegacyRandomAccessIterator) 兼常量表达式迭代器 (ConstexprIterator) (C++20 起)且为字面类型 (LiteralType) (C++17 起) |
const_iterator
|
常随机访问迭代器兼常量表达式迭代器 (ConstexprIterator) (C++20 起)且为字面类型 (LiteralType) (C++17 起) |
reverse_iterator
|
std::reverse_iterator<iterator> |
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
成员函数
隐式定义的成员函数 | |
(构造函数) (隐式声明) |
遵循聚合初始化的规则初始化 array (注意默认初始化可以导致非类的 T 的不确定值) (公开成员函数) |
(析构函数) (隐式声明) |
销毁 array 的每个元素 (公开成员函数) |
operator= (隐式声明) |
以来自另一 array 的每个元素重写 array 的对应元素 (公开成员函数) |
元素访问 | |
访问指定的元素,同时进行越界检查 (公开成员函数) | |
访问指定的元素 (公开成员函数) | |
访问第一个元素 (公开成员函数) | |
访问最后一个元素 (公开成员函数) | |
返回指向内存中数组第一个元素的指针 (公开成员函数) | |
迭代器 | |
返回指向起始的迭代器 (公开成员函数) | |
返回指向末尾的迭代器 (公开成员函数) | |
返回指向起始的逆向迭代器 (公开成员函数) | |
返回指向末尾的逆向迭代器 (公开成员函数) | |
容量 | |
检查容器是否为空 (公开成员函数) | |
返回容纳的元素数 (公开成员函数) | |
返回可容纳的最大元素数 (公开成员函数) | |
操作 | |
以指定值填充容器 (公开成员函数) | |
交换内容 (公开成员函数) |
非成员函数
(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20) |
按照字典顺序比较 array 中的值 (函数模板) |
访问 array 的一个元素 (函数模板) | |
(C++11) |
特化 std::swap 算法 (函数模板) |
(C++20) |
从内建数组创建 std::array 对象 (函数模板) |
辅助类
获得 array 的大小 (类模板特化) | |
获得 array 元素的类型 (类模板特化) |
推导指引(C++17 起)
示例
运行此代码
#include <string> #include <iterator> #include <iostream> #include <algorithm> #include <array> int main() { // 用聚合初始化构造 std::array<int, 3> a1{ {1, 2, 3} }; // CWG 1270 重申前的 C++11 中要求双花括号 // ( C++11 之后的版本和 C++14 起不要求) std::array<int, 3> a2 = {1, 2, 3}; // = 后决不要求 std::array<std::string, 2> a3 = { std::string("a"), "b" }; // 支持容器操作 std::sort(a1.begin(), a1.end()); std::reverse_copy(a2.begin(), a2.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; // 支持带范围 for 循环 for(const auto& s: a3) std::cout << s << ' '; }
输出:
3 2 1 a b
参阅
创建 std::array 对象,从参数推导出其大小和可选的元素类型 (函数模板) |