c++标准模板(STL)(std::array)(二)

news/2024/11/17 4:37:37/
定义于头文件 <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 (注意默认初始化可以导致非类的 T 的不确定值)
(公开成员函数)

(析构函数)

(隐式声明)

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

operator=

(隐式声明)

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


元素访问

访问指定的元素,同时进行越界检查

std::array<T,N>::at

reference at( size_type pos );

(C++17 前)

constexpr reference at( size_type pos );

(C++17 起)

const_reference at( size_type pos ) const;

(C++14 前)

constexpr const_reference at( size_type pos ) const;

(C++14 起)

返回位于指定位置 pos 的元素的引用,有边界检查。

pos 不在容器范围内,则抛出 std::out_of_range 类型的异常。

参数

pos-要返回的元素的位置

返回值

到所需元素的引用。

异常

若 !(pos < size()) 则抛出 std::out_of_range

复杂度

常数。

访问指定的元素

std::array<T,N>::operator[]

reference operator[]( size_type pos );

(C++17 前)

constexpr reference operator[]( size_type pos );

(C++17 起)

const_reference operator[]( size_type pos ) const;

(C++14 前)

constexpr const_reference operator[]( size_type pos ) const;

(C++14 起)

返回位于指定位置 pos 的元素的引用。不进行边界检查。

参数

pos-要返回的元素的位置

返回值

到所需元素的引用。

复杂度

常数。

注意

不同于 std::map::operator[] ,此运算符决不插入新元素到容器。

访问第一个元素

std::array<T,N>::front

reference front();

(C++17 前)

constexpr reference front();

(C++17 起)

const_reference front() const;

(C++14 前)

constexpr const_reference front() const;

(C++14 起)

返回到容器首元素的引用。

在空容器上对 front 的调用是未定义的。

参数

(无)

返回值

到首元素的引用

复杂度

常数

注意

对于容器 c ,表达式 c.front() 等价于 *c.begin() 。

访问最后一个元素

std::array<T,N>::back

reference back();

(C++17 前)

constexpr reference back();

(C++17 起)

const_reference back() const;

(C++14 前)

constexpr const_reference back() const;

(C++14 起)

返回到容器中最后一个元素的引用。

在空容器上对 back 的调用是未定义的。

参数

(无)

返回值

到最后元素的引用。

复杂度

常数。

注意

对于容器 c ,表达式 return c.back(); 等价于 { auto tmp = c.end(); --tmp; return *tmp; }

返回指向内存中数组第一个元素的指针

std::array<T,N>::data

T* data() noexcept;

(C++17 前)

constexpr T* data() noexcept;

(C++17 起)

const T* data() const noexcept;

(C++17 前)

constexpr const T* data() const noexcept;

(C++17 起)

返回指向作为元素存储工作的底层数组的指针。指针满足范围 [data(); data() + size()) 始终是合法范围,即使容器为空(该情况下 data() 不可解引用)。

参数

(无)

返回值

指向底层元素存储的指针。对于非空容器,返回的指针与首元素地址比较相等。

复杂度

常数。

注意

若 size() 为 0 ,则 data() 可能或可能不返回空指针。

调用示例

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <time.h>
#include <array>using namespace std;struct Cell
{int x;int y;Cell() = default;Cell(int a, int b): x(a), y(b) {}Cell &operator +=(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator +(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator *(const Cell &cell){x *= cell.x;y *= cell.y;return *this;}Cell &operator ++(){x += 1;y += 1;return *this;}bool operator <(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}bool operator >(const Cell &cell) const{if (x == cell.x){return y > cell.y;}else{return x > cell.x;}}bool operator ==(const Cell &cell) const{return x == cell.x && y == cell.y;}
};std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}using namespace std;int main()
{std::cout << std::boolalpha;std::mt19937 g{std::random_device{}()};srand((unsigned)time(NULL));auto generate = [](){int n = std::rand() % 10 + 110;Cell cell{n, n};return cell;};//遵循聚合初始化的规则初始化 array (注意默认初始化可以导致非类的 T 的不确定值)std::array<Cell, 6> array1;std::cout << "array1:   ";std::copy(array1.begin(), array1.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::generate(array1.begin(), array1.end(), generate);std::cout << "array1:   ";std::copy(array1.begin(), array1.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;for (size_t index = 0; index < array1.size(); index++){//返回位于指定位置 pos 的元素的引用,有边界检查。//若 pos 不在容器范围内,则抛出 std::out_of_range 类型的异常。std::cout << "array1.at(" << index << "):   " << array1.at(index) << " ";std::cout << std::endl;array1.at(index) = generate();}std::cout << std::endl;std::cout << "array1:   ";std::copy(array1.begin(), array1.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;for (size_t index = 0; index < array1.size(); index++){//返回位于指定位置 pos 的元素的引用。不进行边界检查。std::cout << "array1[" << index << "]:      " << array1.at(index) << " ";std::cout << std::endl;array1[index] = generate();}std::cout << std::endl;std::cout << "array1:   ";std::copy(array1.begin(), array1.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;//返回到容器首元素的引用。 在空容器上对 front 的调用是未定义的。std::cout << "array1.front():   " << array1.front() << std::endl;array1.front() = generate();std::cout << "array1.front():   " << array1.front() << std::endl;std::cout << std::endl;std::cout << "array1.back():    " << array1.back() << std::endl;array1.back() = generate();std::cout << "array1.back():    " << array1.back() << std::endl;std::cout << std::endl;//返回指向作为元素存储工作的底层数组的指针。//指针满足范围 [data(); data() + size()) 始终是合法范围,//即使容器为空(该情况下 data() 不可解引用)。for (size_t index = 0; index < array1.size(); index++){std::cout << "array1.data() + " << index << ":  " << array1.data() + index << " --- ";std::cout << *(array1.data() + index) << std::endl;array1[index] = generate();}std::cout << std::endl;return 0;
}

输出

 


http://www.ppmy.cn/news/53203.html

相关文章

【应用部署】Java项目从开发到部署生产完整流程

文章目录 背景一、开发环境二、项目搭建2.1 Maven创建项目2.1.1 创建maven项目2.1.2 引入依赖2.1.3 maven常用命令 三、SpringBoot基础配置四、项目打包4.1 打包jar4.2 打包war4.2.1 修改项目打包为war包4.2.2 排除内嵌的tomcat&#xff0c;引入外部tomcat4.2.3 添加servlet-ap…

前端常见报错问题处理及技术点收集

一、报错问题收集 1、页面停留半小时左右不动卡死报错问题 Uncaught (in promise) TypeError: Failed to fetch dynamically imported module: http://10.233.54.161/assets/index.f8110bbc.js Promise.then (async) E main.c19f562f.js:39 f main.c19f562f.js:39 z.onClick…

基于ROS实现的机器人运动PID控制器

下面是一个基于ROS实现的机器人运动PID控制器的例子&#xff1a; 首先&#xff0c;需要定义机器人的运动控制器节点&#xff0c;例如&#xff1a; ros::NodeHandle nh; ros::Publisher cmd_vel_pub nh.advertise<geometry_msgs::Twist>("cmd_vel", 10); ros…

黑马redis实战篇-商铺缓存

目录 五、实战篇-商户查询缓存 5.1 什么是缓存 5.2 添加Redis缓存 1、不添加redis时&#xff0c;数据查询的作用模型&#xff1a; 2、添加redis时&#xff0c;数据查询的作用模型&#xff1a; 3、业务流程图&#xff1a;​编辑 4、代码实现 5、练习题 5.3 缓存更新策略…

MATLAB-Lingo求解线性规划问题-奶制品2

奶制品的生产销售计划&#xff0c;给定条件不变 为了增加工厂的获利&#xff0c;开发了奶制品的深加工技术&#xff1a;用2小时和3元加工费&#xff0c;可将1kgA1加工成0.8kg高级奶制品B1&#xff0c;也可将1kgA2加工成0.75kg高级奶制品B2&#xff0c;每千克B1能获利44元&#…

Java设计模式:工厂模式,优化代码的灵活性和可维护性

Java设计模式&#xff1a;工厂模式&#xff0c;优化代码的灵活性和可维护性 Java设计模式之工厂模式什么是工厂模式&#xff1f;工厂模式的使用总结 Java设计模式之工厂模式 作为一名初级程序员&#xff0c;当你开始接触设计模式的时候&#xff0c;你可能会觉得这些概念很抽象…

适合Java老手阅读的书籍推荐:

《Effective Java》是一本由Java编程语言的核心库开发者之一Joshua Bloch撰写的书籍。这本书涵盖了Java语言中的许多重要的主题和问题&#xff0c;并提供了最佳实践和解决方案。 这本书的核心思想是&#xff0c;通过对Java语言的理解和应用&#xff0c;可以写出更加优秀、高质…

PHP入门基础与实战技巧

PHP是一种较为常见的动态网页开发语言&#xff0c;它广泛应用于服务器端的开发和网站构建。与其他语言相比&#xff0c;PHP易学易用、开发效率高、拓展性强等优点&#xff0c;使之成为了广大开发者的首选。如果您想入门PHP开发&#xff0c;本文将介绍一些必备的基础知识和实战技…