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

目录
相关文章
|
9月前
|
存储 容器
2023-3-3-std::array的用法
2023-3-3-std::array的用法
48 0
|
10月前
|
存储 安全 编译器
C++ 中的std::array实现编译器排序
某日二师兄参加XXX科技公司的C++工程师开发岗位第25面: 面试官:array熟悉吗? 二师兄:你说的是原生数组还是std::array? 面试官:你觉得两者有什么区别? 二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,std::array提供了安全的下标访问方法at,当下标越界时会抛出异常。
71 0
|
19天前
|
Python
使用array()函数创建数组
使用array()函数创建数组。
18 3
|
3月前
|
JavaScript 前端开发
总结TypeScript 的一些知识点:TypeScript Array(数组)(下)
一个数组的元素可以是另外一个数组,这样就构成了多维数组(Multi-dimensional Array)。
|
3月前
|
存储 JavaScript 前端开发
总结TypeScript 的一些知识点:TypeScript Array(数组)(上)
数组对象是使用单独的变量名来存储一系列的值。
|
4月前
|
存储 安全 Swift
在Swift中,数组(Array)
在Swift中,数组(Array)
30 3
|
5月前
|
Ruby
|
21天前
|
存储 索引 Python
多数pythoneer只知有列表list却不知道python也有array数组
多数pythoneer只知有列表list却不知道python也有array数组
26 0
|
28天前
|
JavaScript 前端开发 索引
在JavaScript中,可以使用数组字面量或Array构造函数来创建一个数组对象
【4月更文挑战第16天】在JavaScript中,可以使用数组字面量或Array构造函数来创建一个数组对象
23 4
|
6月前
|
算法 Python
数组倍增(Array Doubling
数组倍增(Array Doubling)是一种常见的算法技术,用于解决数组相关的查找、插入、删除等问题。该技术的核心思想是将数组的大小乘以 2,新数组的长度是原数组长度的两倍,然后将原数组中的元素复制到新数组中。在某些情况下,这种技术可以提高算法的效率,尤其是对于动态数据结构的问题。
139 1