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_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

指向 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_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::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 (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
}

输出:

3 2 1
E Ǝ

参阅

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