c++11新增数组 -- array

概述:

array是c++11新增的静态数组类型,数组我们平时使用的很多,那为什么在c++11增加一个array静态数组的类呢?


array的提出可以完全代替我们平时使用的数组,而且其具有更高的安全性,而且使用array表示数组,我们不需要在使用sizeof计算数组的长度,或者在函数中传递一个数组的长度,直接调用array的size()方法就可以获取到数组大大小

当然,c++11的array是一种选择,你可以继续使用原来的数组,这样你需要自己计算长度或者确保安全性,array的安全性高,因为它要进行相应的检测,所以其性能要比普通的数组性能低。(但是并没有低太多)

 

首先array是一个类模板,和之前的容器使用方式是完全类似的,我们要使用array必须导入头文件#include <array> 

 

表 array容器成员函数汇总
成员函数功能
begin()返回指向容器中第一个元素的随机访问迭代器。
end()返回指向容器最后一个元素之后一个位置的随机访问迭代器,通常和 begin() 结合使用。
rbegin()返回指向最后一个元素的随机访问迭代器。
rend()返回指向第一个元素之前一个位置的随机访问迭代器。
cbegin()和 begin() 功能相同,只不过在其基础上增加了 const 属性,不能用于修改元素。
cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin()和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend()和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
size()返回容器中当前元素的数量,其值始终等于初始化 array 类的第二个模板参数 N。
max_size()返回容器可容纳元素的最大数量,其值始终等于初始化 array 类的第二个模板参数 N。
empty()判断容器是否为空,和通过 size()==0 的判断条件功能相同,但其效率可能更快。
at(n)返回容器中 n 位置处元素的引用,该函数自动检查 n 是否在有效的范围内,如果不是则抛出 out_of_range 异常。
front()返回容器中第一个元素的直接引用,该函数不适用于空的 array 容器。
back()返回容器中最后一个元素的直接应用,该函数同样不适用于空的 array 容器。
data()返回一个指向容器首个元素的指针。利用该指针,可实现复制容器中所有元素等类似功能。
fill(val)将 val 这个值赋值给容器中的每个元素。
array1.swap(array2)交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和类型。

 

1. 创建array对象 

  • array<T,size_t size>  数组名;   //  T表示数组存储的类型,size表示数组存储的元素个数。 

2.  数组的赋值 

因为静态数组不向vector那样,可以根据插入的数据自动扩充空间,其空间在定义的时候就已经规定好了,不能根据插入的数据改变空间的大小。

所以对于array对象而言没有添加元素或者删除元素的函数,只存在对数组进行赋值的。 

 

1)使用初始化列表进行赋值  

  • 对象定义的时候赋值:     
    std::array<int, 5> a1{1,2,3,4,5};

  • 给已经定义的对象赋值:
    std::array<int, 5> a2;
    a2 = {1,2,3,4,5};

 

2)使用已存在的数组进行赋值 

  • 对象定义的时候赋值:
    std::array<int, 5> a1{1,2,3,4,5};
    std::array<int, 5> a2(a1);

  • 给已经定义的对象赋值:
    std::array<int, 5> a3;
    a3 = a2; 

注意:   上面互相赋值的两个数组,必须存储的类型和存储数据的个数都是一样的,否则就会出错。

 

3)使用下标运算符和at()函数进行赋值 

  • 使用下标运算符:
    std::array<int,5> a1;
    a1[1] = 10;
    a1[2] = 20;

注意:   数组使用下标运算符的时候,应该小心越界。

  • 使用at()函数:
    std::array<int,5> a1;
    a1.at(0) = 10;
    a1.at(1) = 20;

注意:   at()函数相对于[]运算符,增加了异常处理机制,但是也应该注意越界。

 

4)使用fill()函数 

  • 使用fill()函数:  可以将数组使用某个值进行填充。
    std::array<int, 5> a1;
    a1.fill(5);  // 将数组中的元素都设置为5

for (auto i : a1) {
    std::cout << i << std::endl;   // 打印出5个5
}

 

3. 数组的访问 

1)使用下标运算符和at()进行访问 

std::array<int,5> a1{1,2,3,4,5};

  • 使用[]进行访问:
    std::cout << a1[0] << std::endl; 

  • 使用at()函数进行访问:
    std::cout << a1.at(0) << std::endl;
     

注意:  使用[]和at()访问的时候都需要注意数组越界。

 

2)使用front()和back()函数

std::array<int,5> a1{1,2,3,4,5};

  • 使用front()和back()访问:
    std::cout << a1.front() << std::endl;   // front() 返回数组中第一个元素
    std::cout << a1.back() << std::endl;   // back() 返回数组中最后一个元素

  • 通过front()和back()修改数组中第一个和最后一个元素
    因为两个函数返回的都是数组中存储元素的引用,素以我们可以通过这两个函数的返回值来修改数组的第一个元素和最后一个元素。

    a1.front() = 6;  // 将数组中第一个元素修改为6
    a1.back() = 10;  // 将数组中最后一个修改为10

 

3)使用data()函数 

std::array<int,5> a1{1,2,3,4,5};

  • data()函数:   返回调用数组首元素的指针(地址)

    auto ptr = a1.data();

    std::cout << *ptr << std::endl;   // 输出的结果为1,所以ptr为首元素的地址。

 

4. 数组的长度 

1)使用size() 

 std::array<int,5> a1{1,2,3,4,5};

  • size()函数:  返回调用数组的元素个数
    std::cout << a1.size() << std::endl;   // 输出的结果为5,为数组的元素个数

 

5. 数组的迭代器 

和它的容器一样,我们也可以使用迭代器来遍历数组中的元素。 

其它的迭代器使用方式和其它容器介绍的迭代器使用方式一样的,此处就不多介绍了,可以查看其它容器的相关内容。

std::array<int, 5> a1{1,2,3,4,5};

for (auto it = a1.begin(); it != a1.end(); it++) {
	std::cout << *it << std::endl;   // 输出1,2,3,4,5
}

 

6. swap()函数 

  • swap()函数可以对两个数组对象中的元素进行互换。
    std::array<int, 5> a1{1,2,3,4,5};
    std::array<int, 5> a2{ 10,11,12,13,14};
    a1.swap(a2); // 将两数组元素中的数据进行互换

 注意:   互换的条件,两个数组存储的数据类型和数据个数必须都相同否则就会出错。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/583083.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW自动剪板机控制系统

LabVIEW自动剪板机控制系统 随着工业自动化的快速发展&#xff0c;钣金加工行业面临着生产效率和加工精度的双重挑战。传统的手动或脚踏式剪板机已无法满足现代生产的高效率和高精度要求&#xff0c;因此&#xff0c;自动剪板机控制系统的研究与开发成为了行业发展的必然趋势。…

如何快速开发个性化回收小程序

回收小程序的开发无疑是提升回收业务效率的重要途径。它不仅可以清晰地列出各类回收物品&#xff0c;还能在微信、抖音、支付宝等多个平台同时上线&#xff0c;让回收服务触手可及。那么&#xff0c;如何以最快、最简单、最经济的方式上线这样一个小程序呢&#xff1f; 在这里&…

Linux实训-用户和组的管理

实训1&#xff1a;用户的管理 创建一个新用户user1&#xff0c;设置其主目录为/home/user1。查看/etc/passwd文件的最后一行&#xff0c;看看是如何记录的。查看文件/etc/shadow文件的最后一行&#xff0c;看看如何记录的。给用户user1设置密码。再次查看文件/etc/shadow文件的…

分享5个图源二维码及使用方法

数据是GIS的血液&#xff01; 我们在《4个在ArcGIS中可加载的图源分享》一文中&#xff0c;为大家分享了4个可以直接在ArcMap中打开查看的图源。 现在&#xff0c;我们再分享5个可以在水经微图&#xff08;以下简称“微图”&#xff09;桌面版&#xff08;PC端&#xff09;、…

Kafka Exactly Once 语义实现原理:幂等性与事务消息

01 前言 在现代分布式系统中&#xff0c;确保数据处理的准确性和一致性是至关重要的。Apache Kafka&#xff0c;作为一个广泛使用的流处理平台&#xff0c;提供了强大的消息队列和流处理功能。随着业务需求的增长&#xff0c;Kafka 的事务消息功能应运而生&#xff0c;它允许应…

MacPro(M1,M2芯片)Java开发和常用工具开源软件合集

目录 Java开发软件1 IDE1.1 idea1.2 Vs Code 2 开发工具2.1 数据库数据库模型管理数据库连接客户端 2.2 SSH/Telnet/Serial/Shell/Sftp客户端2.3 MarkDown编辑器2.3 代码片段管理粘贴 3小工具3.1 截图贴图3.2 Mac下修改hosts文件的图形化界面软件 Java开发软件 1 IDE 1.1 ide…

第三方软件测试机构-科技成果评价测试

科技成果评价测试是对科研成果的工作质量、学术水平、实际应用和成熟程度等方面进行的客观、具体、恰当的评价过程。这一评价过程有助于了解科技成果的质量和水平&#xff0c;以及其在学术和应用方面的价值和潜力。 科技成果评价测试主要包括以下几个方面&#xff1a; 工作质量…

设计不外流,保护创意的同时锁住图纸安全!

在设计行业中&#xff0c;图纸和创意文稿的安全至关重要&#xff0c;因为它们体现了企业的创新能力和核心竞争力。华企盾DSC数据防泄密系统提供了一系列功能&#xff0c;可以有效地保护这些珍贵的设计和文档不被外泄。以下是如何利用华企盾DSC系统保障设计图纸安全的关键措施&a…

tableau如何传参数到MySQL数据库

1、打开tableau连接本地MySQL-》新建自定义sql-》创建参数 2、新建一个简单的工作表-》把维度拖拽到行显示结果-》右键显示参数 3、参数传递到数据库sql写法 select * from yonghu where yonghu.姓名 like concat(%,<参数.姓名>,%)select * FROMabadata4WHERE abadata4…

mysql-sql-练习题-1

文章目录 环境注释建表 5张建库学生表课程表教师表分数表总表 语法书写顺序in学过/没学过完全相同 环境 Windows cmd&#xff08;普通用户/管理员&#xff09; mysql -uroot -pmysql版本&#xff0c;模式&#xff08;可自定义&#xff09; select version(),global.sql_mode…

不完全微分PD控制器(CODESYS源代码+算法详细介绍)

完全微分计算公式为Kp*Td/Ts(e(k)-e(k-1))。有关位置式PID和增量式PID更多相关内容,大家可以参考下面的文章链接: 1、CODESYS位置式PID CODESYS位置式PID(完整ST源代码)_codesys pid功能块-CSDN博客文章浏览阅读1.1k次,点赞2次,收藏2次。CODESYS增量式PID完整源代码请参看…

中国标准地图如何与卫星影像叠加

我们在《一幅SHP格式的中国标准地图》一文中&#xff0c;为你分享过一幅SHP格式的中国标准地图&#xff0c;但该数据为等积投影。 由于我们常用的卫星影像为WGS84经纬度投影或墨卡托投影&#xff0c;那么将该数据如何与卫星影像进行叠加制作专题图呢&#xff1f; 我们现在就来…

day17-day20_项目实战项目部署

万信金融 项目部署 目标&#xff1a; 理解DevOps概念 能够使用Docker Compose部署项目 理解持续集成的作用 会使用Jenkins进行持续集成 1 DevOps介绍 1.1 什么是DevOps DevOps是Development和Operations两个词的缩写&#xff0c;引用百度百科的定义&#xff1a; DevOps…

Windows Server配置网卡绑定:NIC组合

正文共&#xff1a;1024 字 12 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在网络设备上&#xff0c;为了提高可靠性&#xff0c;一般会配置链路聚合&#xff08;Link Aggregation&#xff09;&#xff08;网络之路28&#xff1a;二层链路聚合&#xff09;&#xff0c;同样…

GNU Radio之OFDM Channel Estimation底层C++实现

文章目录 前言一、 OFDM Channel Estimation 模块简介二、C 具体实现1、初始化和配置参数2、forecast 函数3、计算载波偏移量4、提取信道响应5、核心的数据处理任务 前言 OFDM Channel Estimation 模块的功能是根据前导码&#xff08;同步字&#xff09;估计 OFDM 的信道和粗略…

FileLink内外网文件摆渡系统产品介绍

在现代企业中&#xff0c;往往存在着多个网络、系统之间的数据孤岛问题&#xff0c;数据难以互相访问和共享。 一、常用的内外网文件摆渡方式 传统的数据交换方式往往需要人工介入&#xff0c;效率低下且容易出错。如&#xff1a;U盘、FTP、VPN等&#xff0c;极易引发各种各样…

CSS常见的 9 个单位汇总!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

银行卡归属地查询API接口快速对接

银行卡归属地查询API接口指的是通过银行卡号查询该银行卡详细信息&#xff0c;包括银行卡名称、卡种、卡品牌、发卡行、编号以及归属地等信息&#xff0c;支持一千多家银行返回归属地信息&#xff0c;那么银行卡归属地查询API接口如何快速对接呢&#xff1f; 首先找到有做银行…

短视频橱窗好物带货者必看:如何解决无商品素材无收益还限流的烦恼?

随着短视频橱窗带货越来越火爆&#xff0c;许多人发现通过短视频橱窗好物带货素材APP不仅可以提升创作效果&#xff0c;还能轻松赚取佣金。下面&#xff0c;为您推荐三款一键领取并直接发布的抖音短视频素材APP&#xff0c;确保您在创作短视频时&#xff0c;既有高质量的素材&a…

Facebook’s Tectonic Filesystem: Efficiency from Exascale——论文阅读

FAST 2021 Paper 分布式元数据论文阅读笔记整理 背景 Blob storage 用来存放大量的文本、图片、视频等非结构化数据 包含 EB 级别的数据 存储内容大小不一&#xff0c;大小几KB到几MB不等 要求低时延 使用 Haystack 和 F4 Data warehouse 存放用于数据分析和机器学习的…
最新文章