std::array - cppreference.com
来自cppreference.com
template< class T, std::size_t N > struct array; |
(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 的元素,并将改变元素的值。
模板形参
| T | - | 元素类型。对元素施加的要求取决于在容器上实际执行的操作。通常要求元素类型是完整类型,并满足可擦除 (Erasable) 的要求,但某些成员函数会施加更严格的要求 |
| 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>[编辑]
|
成员函数
隐式定义的成员函数 | |
(构造函数) (隐式声明) |
遵循聚合初始化的规则初始化 array(注意默认初始化可以导致非类的 T 保有不确定值) (公开成员函数) |
(析构函数) (隐式声明) |
销毁 array 的每个元素 (公开成员函数) |
operator= (隐式声明) |
以来自另一 array 的每个元素重写 array 的对应元素 (公开成员函数) |
元素访问 | |
| 带越界检查访问指定的元素 (公开成员函数) [编辑] | |
| 访问指定的元素 (公开成员函数) [编辑] | |
| 访问第一个元素 (公开成员函数) [编辑] | |
| 访问最后一个元素 (公开成员函数) [编辑] | |
| 直接访问底层连续存储 (公开成员函数) [编辑] | |
迭代器 | |
| 返回指向起始的迭代器 (公开成员函数) [编辑] | |
| 返回指向末尾的迭代器 (公开成员函数) [编辑] | |
| 返回指向起始的逆向迭代器 (公开成员函数) [编辑] | |
| 返回指向末尾的逆向迭代器 (公开成员函数) [编辑] | |
容量 | |
| 检查容器是否为空 (公开成员函数) [编辑] | |
| 返回元素数 (公开成员函数) [编辑] | |
| 返回可容纳的最大元素数 (公开成员函数) [编辑] | |
操作 | |
| 以指定值填充容器 (公开成员函数) [编辑] | |
| 交换内容 (公开成员函数) [编辑] | |
非成员函数
辅助类
示例
#include <algorithm> #include <array> #include <iostream> #include <iterator> #include <string> 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::sort(a1.begin(), a1.end()); std::ranges::reverse_copy(a2, std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; // 支持带范围 for 循环 std::array<std::string, 2> a3{"E", "\u018E"}; for (const auto& s : a3) std::cout << s << ' '; std::cout << '\n'; // 数组创建的推导指引 (C++17 起) [[maybe_unused]] std::array a4{3.0, 1.0, 4.0}; // std::array<double, 3> // 未指定的元素的行为与内建数组相同 [[maybe_unused]] std::array<int, 2> a5; // 无列表初始化,a5[0] 和 a5[1] 均被默认初始化 [[maybe_unused]] std::array<int, 2> a6{}; // 列表初始化,两个运算均被值初始化 // a6[0] = a6[1] = 0 [[maybe_unused]] std::array<int, 2> a7{1}; // 列表初始化,未指定的元素被值初始化 // a7[0] = 1, a7[1] = 0 }
输出: