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

目录
相关文章
|
7月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
242 0
|
存储 容器
2023-3-3-std::array的用法
2023-3-3-std::array的用法
227 0
|
存储 安全 编译器
C++ 中的std::array实现编译器排序
某日二师兄参加XXX科技公司的C++工程师开发岗位第25面: 面试官:array熟悉吗? 二师兄:你说的是原生数组还是std::array? 面试官:你觉得两者有什么区别? 二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且长度不可改变。有一点区别的是,std::array提供了安全的下标访问方法at,当下标越界时会抛出异常。
166 0
|
4月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
106 1
Java 中数组Array和列表List的转换
|
4月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
166 67
|
4月前
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
Web App开发 存储 前端开发
别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
这类问题的重点在于能不能突破基础思路,突破基础思路是从程序员入门变成中级甚至高级的第一步,如果所有需求都通过最基础的业务逻辑来做,是得不到成长的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章