命名空间
变体
操作

std::array

来自 cppreference.com
< cpp‎ | 容器
 
 
 
 
定义在头文件 <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 满足 容器可逆容器 的要求,除了默认构造的数组不是空的,交换的复杂度是线性的,满足 连续容器 的要求,(自 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

传统随机访问迭代器传统连续迭代器value_type

(直到 C++17)

传统随机访问迭代器传统连续迭代器value_type字面量类型

(自 C++17 起)
(直到 C++20)

传统随机访问迭代器contiguous_iteratorconstexpr 迭代器value_type

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

LegacyRandomAccessIteratorLegacyContiguousIteratorconst value_type

(直到 C++17)

LegacyRandomAccessIteratorLegacyContiguousIterator 是一个 LiteralTypeconst value_type

(自 C++17 起)
(直到 C++20)

LegacyRandomAccessIteratorcontiguous_iteratorConstexprIteratorconst value_type

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

[编辑] 辅助类

获取 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 Ǝ

[编辑] 另请参阅

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