std::array 教程(来自cppreference.com)

简介: std::array 教程(来自cppreference.com)

std::array - C++容器库

在头文件中定义

模板:

template<
    class T,
    std::size_t N
> struct array;

自C++11开始有的。

简介

std::array是一个封装固定大小数组的容器。

这种容器型别其语义与只含有一笔以T[N]表示之C风格阵列做为它唯一非静态数据成员之struct相同。和C-style 数组不同的地方在于它不会自动衰减至类型T*。作为聚集类别,可以使用最多N个可转换为T的初始化值进行聚合初始化:std::array a = {1,2,3};.

此结构体兼具了C-style数组性能高、访问速度快等特点,并且添加了标准化存储器所包含诸如知道本身大小、支援赋值、正逆序迭代器等优点(但交换时复杂度呈现线性),满足Container 和 ReversibleContainer需求,除了默认建立构造函数并没有为空外(从C++17开始)其实满足 ContiguousContainer 的要求且满足部分 SequenceContainer需要。

对于零长度数组(即: N == 0)则有特殊处理方式,在这种情况下,array.begin() == array.end(),返回一个独特值.如果试图调用空数组的 front() 或 back(),结果是未定义行为.

Array还可以用作包含N个元素相同类型的元组.

迭代器失效:

作为一般规则,数组的迭代器在数组的生命周期内永远不会失效。然而,需要注意的是,在交换过程中,迭代器将继续指向相同的数组元素,因此它的值将会改变。

成员类型:

成员类型 定义
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 根据 C++ 版本,迭代器可能是 LegacyRandomAccessIterator,LegacyContiguousIterator 或 ConstexprIterator,指向 value_type
const_iterator 根据 C++ 版本,迭代器可能是 LegacyRandomAccessIterator,LegacyContiguousIterator 或 ConstexprIterator,指向 const value_type
reverse_iterator std::reverse_iterator
const_reverse_iterator std::reverse_iterator<const_iterator>

成员函数:

成员函数 定义
构造函数 按照聚合初始化的规则初始化数组
析构函数 销毁数组的每一个元素
operator= 用另一个数组的对应元素覆盖数组的每一个元素
at 访问指定元素并进行边界检查
operator[] 访问指定元素
front 访问第一个元素
back 访问最后一个元素
data 直接访问底层数组
begin/cbegin 返回指向开始的迭代器
end/cend 返回指向结束的迭代器
rbegin/crbegin 返回指向开始的反向迭代器
rend/crend 返回指向结束的反向迭代器
empty 检查容器是否为空
size 返回元素的数量
max_size 返回可能的最大元素数量
fill 用指定值填充容器
swap 交换内容

非成员函数:

非成员函数 定义
operator==, operator!=, operator<, operator<=, operator>, operator>=, operator<=> 在数组中进行词法比较
std::get(std::array) 访问数组的一个元素
std::swap(std::array) 特殊的 std::swap 算法
to_array 从内建数组创建一个 std::array 对象

辅助类:

辅助类 定义
std::tuple_sizestd::array 获取数组的大小
std::tuple_elementstd::array 获取数组元素的类型

推断引导:

C++17以后的版本提供了推断引导。

示例:

以下示例应塞入代码段内:

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <string>
int main()
{
#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 =
 
    std::array<std::string, 2> a3 = { std::string("a"), "b" };
 
    // container operations are supported
    std::sort(a1.begin(), a1.end());
    std::reverse_copy(a2.begin(), a2.end(),
                      std::ostream_iterator<int>(std::cout, " "));
 
    std::cout << '\n';
 
    // ranged for loop is supported
    for (const auto& s: a3)
        std::cout << s << ' ';
 
    // deduction guide for array creation (since C++17)
    [[maybe_unused]] std::array a4{3.0, 1.0, 4.0};  // -> std::array<double, 3>
}
Output:

3 2 1

a b

目录
相关文章
|
存储 容器
2023-3-3-std::array的用法
2023-3-3-std::array的用法
85 0
|
存储 安全 编译器
C++ 中的std::array实现编译器排序
某日二师兄参加XXX科技公司的C++工程师开发岗位第25面: 面试官:array熟悉吗? 二师兄:你说的是原生数组还是std::array? 面试官:你觉得两者有什么区别? 二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,std::array提供了安全的下标访问方法at,当下标越界时会抛出异常。
103 0
|
6月前
|
Python
使用array()函数创建数组
使用array()函数创建数组。
132 3
|
1月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
1月前
|
存储 JavaScript 前端开发
JavaScript Array(数组) 对象
JavaScript Array(数组) 对象
27 3
|
1月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
|
2月前
|
Go
Golang语言之数组(array)快速入门篇
这篇文章是关于Go语言中数组的详细教程,包括数组的定义、遍历、注意事项、多维数组的使用以及相关练习题。
35 5
|
3月前
|
Python
PyCharm View as Array 查看数组
PyCharm View as Array 查看数组
88 1
|
4月前
|
索引