std::array

来自cppreference.com
< cpp‎ | container
在标头 <array> 定义
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)

当其长度为零时 arrayN == 0)有特殊情况。此时,array.begin()== array.end(),并拥有某个唯一值。在零长 array 上调用 front()back() 是未定义的。

也可将 array 当做拥有 N 个同类型元素的元组。

目录

[编辑]迭代器失效

按照规则,指向 array 的迭代器在 array 的生存期间决不会失效。然而要注意,在 swap 时,迭代器将继续指向同一 array 的元素,并将改变元素的值。

[编辑]模板形参

T - 元素类型。必须为可移动构造(MoveConstructible) 可移动赋值(MoveAssignable)
N - 数组中的元素数量或 0

[编辑]成员类型

成员类型 定义
value_typeT[编辑]
size_typestd::size_t[编辑]
difference_typestd::ptrdiff_t[编辑]
referencevalue_type&[编辑]
const_referenceconst value_type&[编辑]
pointervalue_type*[编辑]
const_pointerconst value_type*[编辑]
iterator

指向 value_type老式随机访问迭代器(LegacyRandomAccessIterator) 老式连续迭代器(LegacyContiguousIterator)

指向 value_type老式随机访问迭代器(LegacyRandomAccessIterator) 老式连续迭代器(LegacyContiguousIterator) 且为字面类型(LiteralType)

(C++20 前)

指向 value_type老式随机访问迭代器(LegacyRandomAccessIterator) contiguous_iterator常量表达式迭代器(ConstexprIterator)

(C++20 起)
[编辑]
const_iterator

指向 const value_type老式随机访问迭代器(LegacyRandomAccessIterator) 老式连续迭代器(LegacyContiguousIterator)

指向 const value_type老式随机访问迭代器(LegacyRandomAccessIterator) 老式连续迭代器(LegacyContiguousIterator) 并且是字面类型(LiteralType)

(C++20 前)

指向 const value_type老式随机访问迭代器(LegacyRandomAccessIterator) contiguous_iterator常量表达式迭代器(ConstexprIterator)

(C++20 起)
[编辑]
reverse_iteratorstd::reverse_iterator<iterator>[编辑]
const_reverse_iteratorstd::reverse_iterator<const_iterator>[编辑]

[编辑]成员函数

隐式定义的成员函数
(构造函数)
(隐式声明)
遵循聚合初始化的规则初始化 array(注意默认初始化可以导致非类的 T 保有不确定值)
(公开成员函数)
(析构函数)
(隐式声明)
销毁 array 的每个元素
(公开成员函数)
operator=
(隐式声明)
以来自另一 array 的每个元素重写 array 的对应元素
(公开成员函数)
元素访问
带越界检查访问指定的元素
(公开成员函数)[编辑]
访问指定的元素
(公开成员函数)[编辑]
访问第一个元素
(公开成员函数)[编辑]
访问最后一个元素
(公开成员函数)[编辑]
直接访问底层连续存储
(公开成员函数)[编辑]
迭代器
返回指向起始的迭代器
(公开成员函数)[编辑]
返回指向末尾的迭代器
(公开成员函数)[编辑]
返回指向起始的逆向迭代器
(公开成员函数)[编辑]
返回指向末尾的逆向迭代器
(公开成员函数)[编辑]
容量
检查容器是否为空
(公开成员函数)[编辑]
返回元素数
(公开成员函数)[编辑]
返回可容纳的最大元素数
(公开成员函数)[编辑]
操作
以指定值填充容器
(公开成员函数)[编辑]
交换内容
(公开成员函数)[编辑]

[编辑]非成员函数

(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 的值
(函数模板)[编辑]
访问 array 的一个元素
(函数模板)[编辑]
特化 std::swap 算法
(函数模板)[编辑]
(C++20)
从内建数组创建 std::array 对象
(函数模板)[编辑]

[编辑]辅助类

获得 array 的大小
(类模板特化)[编辑]
获得 array 元素的类型
(类模板特化)[编辑]

推导指引

(C++17 起)

[编辑]示例

#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(constauto& 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}

输出:

3 2 1 E Ǝ

[编辑]参阅

可动态调整大小的固定容量原位连续数组
(类模板)[编辑]
动态的连续数组
(类模板)[编辑]
双端队列
(类模板)[编辑]
(库基础 TS v2)
创建 std::array 对象,从实参推导出其大小和可选的元素类型
(函数模板)[编辑]
close