IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++标准模板(STL),std::array用法说明 -> 正文阅读

[C++知识库]c++标准模板(STL),std::array用法说明

定义于头文件 <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 的元素,并将改变元素的值。

成员类型

成员类型定义
value_typeT
size_typestd::size_t
difference_typestd::ptrdiff_t
referencevalue_type&
const_referenceconst value_type&
pointervalue_type*
const_pointerconst value_type*
iterator遗留随机访问迭代器 (LegacyRandomAccessIterator) 兼常量表达式迭代器 (ConstexprIterator) (C++20 起)且为字面类型 (LiteralType) (C++17 起)
const_iterator常随机访问迭代器兼常量表达式迭代器 (ConstexprIterator) (C++20 起)且为字面类型 (LiteralType) (C++17 起)
reverse_iteratorstd::reverse_iterator<iterator>
const_reverse_iteratorstd::reverse_iterator<const_iterator>

成员函数

隐式定义的成员函数

(构造函数)

(隐式声明)

遵循聚合初始化的规则初始化 array (注意默认初始化可以导致非类的 T 的不确定值)
(公开成员函数)

(析构函数)

(隐式声明)

销毁 array 的每个元素
(公开成员函数)

operator=

(隐式声明)

以来自另一 array 的每个元素重写 array 的对应元素
(公开成员函数)

元素访问

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

按照字典顺序比较 array 中的值
(函数模板)

std::get(std::array)

访问 array 的一个元素
(函数模板)

std::swap(std::array)

(C++11)

特化 std::swap 算法
(函数模板)

to_array

(C++20)

从内建数组创建 std::array 对象
(函数模板)

辅助类

std::tuple_size<std::array>

获得 array 的大小
(类模板特化)

std::tuple_element<std::array>

获得 array 元素的类型
(类模板特化)

代码示例

#include <string>
#include <iostream>
#include <algorithm>
#include <array>
#include <iterator>

int main()
{
    // 用聚合初始化构造
    std::array<int, 5> a1{ {1, 2, 3, 4, 5} };   // CWG 1270 重申前的 C++11 中要求双花括号
                                                // ( C++11 之后的版本和 C++14 起不要求)
    std::array<int, 5> a2 = {1, 2, 3};          // = 后决不要求

    //从0开始,访问指定的元素,同时进行越界检查,越界时抛出异常
    std::cout << "a1.at(1): " << a1.at(1) << std::endl; // 打印   2

    //从0开始,访问指定的元素,不进行越界检查
    std::cout << "a1[10]:   " << a1[10] << std::endl;   // 未知,打印结果因系统而异

    std::cout << "------------\n";

    //访问第一个元素
    std::cout << "front():  " << a1.front() << std::endl;   // // 打印   1

    //访问最后一个元素
    std::cout << "back():  " << a1.back() << std::endl;   // // 打印   5

    std::cout << "------------\n";
    //iterator  迭代器
    //const_iterator 只读迭代器      const:只读
    // 打印   1 2 3 4 5
    std::cout << "order:  ";
    for(std::array<int, 5>::const_iterator it = a1.begin(); it != a1.end(); it++)
    {
        std::cout << *it << " ";
    }
    std::cout << "\n";

    // 打印 5 4 3 2 1
    std::cout << "reverse:  ";
    for(std::array<int, 5>::const_reverse_iterator it = a1.rbegin(); it != a1.rend(); it++)
    {
        std::cout << *it << " ";
    }
    std::cout << "\n";

    std::cout << "------------\n";

    // 检查容器是否为空
    std::cout << "empty(): " << a1.empty() << "\n"; // 打印 0

    // 返回容纳的元素数
    std::cout << "size(): " << a1.size() << "\n"; // 打印 5
    // 返回容纳的元素数, 在array中 size(),max_size()查看源码,表示的都是数组大小,一致
    std::cout << "max_size(): " << a1.max_size() << "\n"; // 打印 5

    std::cout << "------------\n";
    // 赋给定值 value 给容器中的所有元素。
    a2.fill(3);
    std::cout << "fill(): ";
    // 支持带范围 for 循环
    // 打印 3 3 3 3 3
    for(const auto& s: a2)
        std::cout << s << ' ';
    std::cout << "\n";
    std::cout << "------------\n";

    //交换内容,将容器内容与 other 的内容交换。不导致迭代器和引用关联到别的容器,
    //长度一致
    a1.swap(a2);
    std::cout << "swap():\n";
    for(const auto& s: a1)
        std::cout << s << ' ';
    std::cout << "\n";
    for(const auto& s: a2)
        std::cout << s << ' ';
    std::cout << "\n";

    std::cout << "------------\n";
    // 访问 array 的一个元素
    //从 array 提取第 Ith 个元素。
    //I 必须是范围 [0, N) 中的整数值。与 at() 或 operator[] 相反,这在编译时强制。
    std::get<0>(a1) = 1;
    // 打印 a[0] = 1
    std::cout << "get(): a[0]   " << a1[0] << std::endl;
    std::cout << "------------\n";

    // 排序
    std::cout << "sort():\n";
    for(const auto& s: a2)
        std::cout << s << ' ';
    std::cout << "\n";

    // 大到小
    std::cout << "std::greater: ";
    std::sort(a2.begin(), a2.end(), std::greater<int>());
    for(const auto& s: a2)
        std::cout << s << ' ';
    std::cout << "\n";
    // 小到大
    std::cout << "std::less: ";
    std::sort(a2.begin(), a2.end(), std::less<int>());
    for(const auto& s: a2)
        std::cout << s << ' ';
    std::cout << "\n";
    std::cout << "------------\n";

    // 逆序拷贝
    std::cout << "reverse_copy(): ";
    std::reverse_copy(a2.begin(), a2.end(),
                      std::ostream_iterator<int>(std::cout, " "));

    std::cout << '\n';
}

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 11:45:37  更:2021-08-13 11:48:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 2:46:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码