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;
这样就形成了一个类似于二元数组的东西