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
满足 容器 和 可逆容器 的要求,除了默认构造的数组不是空的,交换的复杂度是线性的,满足 连续容器 的要求,(自 C++17 起) 并部分满足 序列容器 的要求。
对于零长度数组 (N == 0
) 有一个特殊情况。在这种情况下,array.begin() == array.end(),它是一个唯一的特定值。在零大小数组上调用 front() 或 back() 的效果是未定义的。
数组也可以用作 N
个相同类型元素的元组。
内容 |
[编辑] 迭代器失效
作为一项规则,数组的迭代器在数组的整个生命周期中永远不会失效。但是,应该注意,在 交换 期间,迭代器将继续指向同一个数组元素,因此它的值会改变。
[编辑] 模板参数
T | - | 元素类型 必须是 可移动构造 和 可移动赋值。 |
N | - | 数组中的元素数量或 0。 |
本节不完整 原因:完成模板参数的描述。 |
[编辑] 成员类型
成员类型 | 定义 | ||||||
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
|
| ||||||
const_iterator
|
| ||||||
reverse_iterator
|
std::reverse_iterator<iterator> | ||||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[编辑] 成员函数
隐式定义的成员函数 | |
(构造函数) (隐式声明) |
根据 聚合初始化 规则初始化数组 (注意,对于非类 T ,默认初始化可能会导致不确定的值)(公共成员函数) |
(析构函数) (隐式声明) |
销毁数组的每个元素 (公共成员函数) |
operator= (隐式声明) |
用另一个数组的对应元素覆盖数组的每个元素 (公共成员函数) |
元素访问 | |
在边界检查的情况下访问指定元素 (公共成员函数) | |
访问指定元素 (公共成员函数) | |
访问第一个元素 (公共成员函数) | |
访问最后一个元素 (公共成员函数) | |
直接访问底层连续存储 (公共成员函数) | |
迭代器 | |
返回指向开头的迭代器 (公共成员函数) | |
返回指向结尾的迭代器 (公共成员函数) | |
返回指向开头的反向迭代器 (公共成员函数) | |
返回指向结尾的反向迭代器 (公共成员函数) | |
容量 | |
检查容器是否为空 (公共成员函数) | |
返回元素数量 (公共成员函数) | |
返回最大可能的元素数量 (公共成员函数) | |
操作 | |
用指定的值填充容器 (公共成员函数) | |
交换内容 (公共成员函数) |
[编辑] 非成员函数
(C++11)(C++11)(C++20中已移除)(C++11)(C++20中已移除)(C++11)(C++20中已移除)(C++11)(C++20中已移除)(C++11)(C++20中已移除)(C++20) |
按字典序比较两个 array 的值(函数模板) |
(C++11) |
访问 array 的元素(函数模板) |
(C++11) |
专门化 std::swap 算法 (函数模板) |
(C++20) |
从内置数组创建 std::array 对象(函数模板) |
[编辑] 辅助类
(C++11) |
获取 array 的大小(类模板专门化) |
获取 array 元素的类型(类模板专门化) |
推导指南 |
(自 C++17 起) |
[编辑] 示例
#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 = // Container operations are supported std::sort(a1.begin(), a1.end()); std::ranges::reverse_copy(a2, std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; // Ranged for loop is supported std::array<std::string, 2> a3{"E", "\u018E"}; for (const auto& s : a3) std::cout << s << ' '; std::cout << '\n'; // Deduction guide for array creation (since C++17) [[maybe_unused]] std::array a4{3.0, 1.0, 4.0}; // std::array<double, 3> // Behavior of unspecified elements is the same as with built-in arrays [[maybe_unused]] std::array<int, 2> a5; // No list init, a5[0] and a5[1] // are default initialized [[maybe_unused]] std::array<int, 2> a6{}; // List init, both elements are value // initialized, a6[0] = a6[1] = 0 [[maybe_unused]] std::array<int, 2> a7{1}; // List init, unspecified element is value // initialized, a7[0] = 1, a7[1] = 0 }
输出
3 2 1 E Ǝ
[编辑] 另请参阅
(C++26) |
动态可调整大小、固定容量、就地连续数组 (类模板) |
动态连续数组 (类模板) | |
双端队列 (类模板) | |
(库基础 TS v2) |
创建一个 std::array 对象,其大小和可选的元素类型从参数中推断 (函数模板) |