array容器是一种序列容器,可以理解为在普通数组的基础上,增加一些成员函数和全局函数的修改,致使功能完备。
而有一点是,array容器的大小是固定的,它无法如vector容器动态的扩展或收缩存储空间,因此array容器只能用于访问或替换存储的元素,无法增加或移除容器内的元素。
在使用array容器时,需要引进<array>的头文件;
#include<array>
using namespace std;
创建array容器简单语法:
array<数据类型T,容器大小N> 容器命名 {};
其中,必须指明具体的存储数据类型T, 而容器大小N也必须是常量,不能用变量去表示。(以int型为例创建存储量十个元素的array容器):
array<int, 10> Box1 {};
此时,array容器中的元素被初始化为0。
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
当然,我们也可以像创建普通数组一样对其进行初始化:
array<int, 10> Box2 {1,2,3,4,5};
1 | 2 | 3 | 4 | 5 | 0 | 0 | 0 | 0 | 0 |
前置5位的元素会被赋予初值,而其余的元素仍然默认为0。
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容器中的所有元素,但前提是它们具有相同的长度和类型 |
注意:在C++标准库中也存在begin()和end()这两个函数,和array容器包含的begin()和end()成员函数并非完全相同,标准库提供的这两个函数的操作对象既可以是容器也可以是普通数组。当操作对象是容器时,和array容器中的功能相同;当操作对象是普通数组时,则函数返回的不再是随机访问迭代器,而是返回指针。且begin()返回指向数组的第一个元素的指针,而end()是返回数组中最后一个元素之后一个位置的指针。
选取部分功能成员函数示例:
#include<iostream>
#include<array>//引入array容器头文件
using namespace std;
int main() {
array<int, 5> Box1{};
for (int i = 0; i < 5; i++) {//利用at(n)函数初始化使得Box{1,2,3,4,5}
Box1.at(i) = i + 1;
}
array<int, 5>Box2{5,4,3,2,1};
Box2.swap(Box1);//交换容器Box1和Box2所有元素
if (!Box1.empty()) {//判断容器是否为空,若不为空,则输出所有元素
for (auto i = Box1.begin(); i < Box1.end(); i++) {
cout << *i << " ";
}
}
cout << endl;
cout << "--------------" << endl;
if (!Box2.empty()) {
for (auto i = Box2.begin(); i < Box2.end(); i++) {
cout << *i << " ";
}
}
return 0;
}
运行结果:
5 4 3 2 1
--------------
1 2 3 4 5
注意:其中auto关键字,可以使编译器自动甄别变量的类型,也就是根据后面的值,来自行推测前面的类型应该是什么;auto的作用就是为了简化变量初始化。
而需要注意的是,以auto声明的变量必须已经被初始化,已经涵盖有元素,否则将会报错。
因为auto只是一个占位符,并不是如模板中数据类型参数,因此也就不能用于类型转换或其他的一些操作。(以上代码,只是简单的用auto替代int)