【 1. 基本原理 】
- array 是在 C++ 普通数组的基础上添加了一些成员函数和全局函数。在使用上,它 比普通数组更 安全,且效率并没有因此变差。
- array 容器的 大小是固定的,无法动态的扩展或收缩,这也就意味着,在使用该容器的过程无法借由增加或移除元素而改变其大小,它只允许访问或者替换存储的元素。
- array 以类模板的形式定义在 <array> 头文件, 命名空间 std 中:
在 array<T,N> 类模板中,T 用于指明容器中的存储的具体数据类型,N 用于指明容器的大小,需要注意的是,这里的 N 必须是常量,不能用变量表示。
namespace std{
template <typename T, size_t N>
class array;
}
【 2. array 的创建 】
2.1 不赋初值
- 创建一个名为 myarray 的 array 容器,其包含 10 个浮点型元素。但是,由于未显式指定这 10 个元素的值,因此使用这种方式创建的容器中, 各个元素的值是不确定的(array 容器不会做默认初始化操作)。
array<double, 10> myarray;
2.2 赋默认值
- 将所有的元素初始化为 0 或者和默认元素类型等效的值:
使用该语句,容器中所有的元素都会被初始化为 0.0。
array < double, 10> values {};
2.3 赋指定值
- 在创建 array 容器的实例时,可以像创建常规数组那样对元素进行初始化:
array<double, 10> values {0.5,1.0,1.5,,2.0};
- 这里只初始化了前 4 个元素,剩余的元素都会被初始化为 0.0,如下图所示:
【 3. 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 异常。 正是由于 array 容器中包含了 at() 这样的成员函数,使得操作元素时比普通数组更安全。 |
front() | 返回容器中第一个元素的直接引用,该函数不适用于空的 array 容器。 |
back() | 返回容器中最后一个元素的直接应用,该函数同样不适用于空的 array 容器。 |
data() | 返回一个指向容器首个元素的指针。利用该指针,可实现复制容器中所有元素等类似功能。 |
fill(val) | 将 val 这个值赋值给容器中的每个元素。 |
array1.swap(array2) | 交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和类型。 |
- 在 <array> 头文件中还重载了 get() 全局函数 ,该重载函数的功能是访问容器中指定的元素,并返回该元素的引用。
实例
#include <iostream>
#include <array>
using namespace std;
int main()
{
array<int, 4> values{};
int y[] = { 3,1,4,5 };
//初始化 values 容器
for (int i = 0; i < values.size(); i++) {
values.at(i) = y[i];
}
//使用 get() 重载函数输出指定位置元素
cout << get<3>(values) << endl;
//如果容器不为空,则输出容器中所有的元素
if (!values.empty()) {
for (auto val = values.begin(); val < values.end(); val++) {
cout << *val << " ";
}
}
}