0 - 前言
参考:http://c.biancheng.net/view/6688.html
1 - array是什么
array 容器是 C++11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全,且效率并没有因此变差。
特性:array 容器的大小是固定的,无法动态的扩展或收缩,这也就意味着,在使用该容器的过程无法借由增加或移除元素而改变其大小,它只允许访问或者替换存储的元素。
2 - 使用array
array定义在头文件 < array > 中,引入头文件:
#include <array>
using namespace std;
初始化:在 array<T,N> 类模板中,T 用于指明容器中的存储的具体数据类型,N 用于指明容器的大小,需要注意的是,这里的 N 必须是常量,不能用变量表示。
array<double, 10> values {};//将所有的元素初始化为 0.0 或者和默认元素类型等效的值
常用函数:
一些容器共有的函数在 3 STL序列式容器简介【array、vector、deque、list、forward_list】【容器函数合集】 中已经介绍过,这里只介绍一下array比较特色的成员函数
成员函数 | 功能 |
---|---|
at(n) | 返回容器中 n 位置处元素的引用,该函数自动检查 n 是否在有效的范围内,如果不是则抛出 out_of_range 异常。 |
fill(val) | 将 val 这个值赋值给容器中的每个元素。 |
array1.swap(array2) | 交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和类型。 |
除此之外,C++ 11 标准库还新增加了 begin() 和 end() 这 2 个函数,和 array 容器包含的 begin() 和 end() 成员函数不同的是,标准库提供的这 2 个函数的操作对象,既可以是容器,还可以是普通数组。当操作对象是容器时,它和容器包含的 begin() 和 end() 成员函数的功能完全相同;如果操作对象是普通数组,则 begin() 函数返回的是指向数组第一个元素的指针,同样 end() 返回指向数组中最后一个元素之后一个位置的指针(注意不是最后一个元素)。
3 - 访问array元素
3 - 1 单个元素
可以通过容器名[]
的方式直接访问和使用容器中的元素,这和 C++标准数组访问元素的方式相同,例如:
values[4] = values[3] + 2.O*values[1];
需要注意的是,使用如上这样方式,由于没有做任何边界检查,所以即便使用越界的索引值去访问或存储元素,也不会被检测到。
为了能够有效地避免越界访问的情况,可以使用 array 容器提供的 at() 成员函数,例如 :
values.at (4) = values.at(3) + 2.O*values.at(1);
这行代码和前一行语句实现的功能相同,其次当传给 at() 的索引是一个越界值时,程序会抛出 std::out_of_range 异常。
array 容器提供了 data() 成员函数,通过调用该函数可以得到指向容器首个元素的指针。通过该指针,我们可以获得容器中的各个元素,例如:
#include <iostream>
#include <array>
using namespace std;
int main()
{
array<int, 5> words{1,2,3,4,5};
cout << *( words.data()+1);
return 0;
}
//运行结果为:2
3 - 2 多个元素
array 容器提供的 size() 函数能够返回容器中元素的个数(函数返回值为 size_t 类型)
对于任何可以使用迭代器的容器,都可以使用基于范围的循环
下面例子中的三个循环,就分别展示通过size()、auto&、 end()来循环访问array元素
#include <iostream>
#include <iomanip>
#include <array>
using namespace std;
int main()
{
array<int, 5> values1;
array<int, 5> values2;
//初始化 values1 为 {0,1,2,3,4}
for (size_t i = 0; i < values1.size(); ++i)
{
values1.at(i) = i;
}
//初始化 values2 为{10,11,12,13,14}
int initvalue = 10;
for (auto& value : values2)
{
value = initvalue;
initvalue++;
}
for (auto i = values1.begin(); i < values1.end(); i++) {
cout << *i << " ";
}
return 0;
}