C++20学习笔记——Array

文章介绍了C++中的std::array容器,包括其声明方式、初始化、元素访问、填充、大小查询以及与其他数组的比较。std::array提供了安全的访问方式,如at()函数,且支持直接比较和整体赋值。此外,它可以存储在其他容器中,如std::vector。
摘要由CSDN通过智能技术生成

array<T,N>容器

需添加 array 模块

import<array>;

翻译一下就是array<数据类型,大小> 数组名,以下是一个合法的命名

std::array<int,100> age;

从C++17开始,可以使用下列方式进行声明

std::array values { 0.1 , 1.2 , 3.3 , 4.1 };
相当于:
std::array<double,4>;

编译器可以通过花括号来判断array的类型,但需注意花括号内的值必须类型相同并且不能为空
使用fill()函数可以填满array

values.fill(2333);

values将会被整数2333填满
使用size()可以查看array的元素个数,返回size_t类型,并且array总会知道自己含有多少元素

std::array<int,4> a{ 1 , 2 , 3 , 4 };
std::cout << a.size() << std::endl;  //输出:4

访问元素

array的访问方法与数组相同,但是安全性更强,因为其中含有at()函数可以检测元素的值是否有效,如果越界,会抛出错误

std::array<int, 3> a{ 1,2,3 };
int sum = 0;
for (size_t i=0;i<4;++i)
    sum += a.at(i);              //与 sum+=a[i];效果相同
std::cout << sum << std::endl;   //输出:6

以下书写会报错,但抛出的错误形式不同

sum=a[3];       //Expression: array subscript out of range
sum=a.at(3);    //abort() has been called 解释一下,abort()异常被抛出有以下原因:
/*
1.非法指针访问和内存泄漏
2.设置的指针范围跟你运行的不对
3.指针访问内存越界出现问题。
4.因为不支持中文。
5.内存不够分配
6.多线程访问资源出的问题。
7.检查exe和dll是否混用的不同版本的crt
*/

array还允许直接访问数组前端与尾端,values.front() = values[0],values.back() = values[values.size()-1]


将array作为整体操作

只要array的大小相同,储存的数据类型相同,那么array就可以整体进行比较

std::array<int, 3> a{1,2,3};
std::array<int, 3> b{1,2,3};
std::array<int, 3> c{1,2,4};
if (a == b) std::cout << "They are equal" << std::endl;     //输出:They are equal
if (a != c) std::cout << "They aren't equal" << std::endl;  //输出:They aren't equal
if (a < c) std::cout << "a is less than c" << std::endl;    //输出:a is less than c

在第三个比大小时,只要一对元素满足条件就能判断出大小

注:从C++20开始,已废弃使用<,>,==,!=的C风格的数组类型的比较。现在使用此类比较编译器会发出警告,未来某个时候将完全废弃不允许使用这样的语法。

只要array之间的类型和大小相同,那么可以直接进行赋值操作

a = c;

同时array可以被储存在其他容器中,而普通数组就不行,如:

std::vector<std::array<int,3>> ohhh;

这样就形成了一个类似于二元数组的东西


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值