一、前言
array 容器是 C++ 11 规范中新增的序列容器,就是在 C++ 一般数组的根底上,增加了一些成员函数和全局函数。在应用上,它比一般数组更平安,且效率并没有因而变差。
和其它容器不同,array 容器的大小是固定的,无奈动静的扩大或膨胀,只容许拜访或者替换存储的元素。
二、详解
array 容器以类模板的模式定义在 <array> 头文件,并位于命名空间 std 中。因而,在应用该容器之前,代码中需引入 <array> 头文件,并默认应用 std 命令空间。即:
#include <array>using namespace std;
在 array<T,N> 类模板中,T 用于指明容器中的存储的具体数据类型,N 用于指明容器的大小,N 必须是常量,不能用变量示意。
1、初始化
① std::array<int, 10> values; ② std::array<int, 10> values {};③ std::array<double, 10> values {2,1,4,9};
以上都能够对array进行初始化,区别在于:
①各个元素的值是不确定的(array 容器不会做默认初始化操作)
②将所有的元素初始化为 0 或者和默认元素类型等效的值
③能够初始化一部分值,残余的均初始化值默认为0
2、成员函数
成员函数 | 性能 |
---|---|
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 容器中的所有元素,但前提是它们具备雷同的长度和类型 |
3、实例
1)初始化
// testArray.cpp : 此文件蕴含 "main" 函数。程序执行将在此处开始并完结。//#include <iostream>#include <array>using namespace std;int main(){ std::array<int, 5> arrayInt; std::array<int, 5> arrayInt2{}; std::array<int, 5> arrayInt3{ 2,6,4,3 }; //遍历array的值 for (int i = 0; i < arrayInt.size(); i++) { std::cout << "输入arrayInt[" << i << "]=" << arrayInt[i] << std::endl; } for (int i = 0; i < arrayInt2.size(); i++) { std::cout << "输入arrayInt2[" << i << "]=" << arrayInt2[i] << std::endl; } for (int i = 0; i < arrayInt3.size(); i++) { std::cout << "输入arrayInt3[" << i << "]=" << arrayInt3[i] << std::endl;; } system("pause"); return 0;}
后果如下:
2)begin()的应用
std::array<int, 5>::iterator arrayIter = arrayInt.begin(); std::cout << "输入arrayInt begin:" << *arrayIter << std::endl;
后果如下:
3)rbegin()的应用
//rbegin()的应用 std::array<int, 5>::reverse_iterator arrayRIter = arrayInt.rbegin(); std::cout << "输入arrayInt rbegin:" << *arrayIter << std::endl;
后果如下:
4)size()的应用
//size()的应用 std::cout << "输入arrayInt size:" << arrayInt.size() << std::endl;
后果如下:
5)max_size()的应用
//max_size()的应用 std::cout << "输入arrayInt max_size:" << arrayInt.max_size() << std::endl;
后果如下:
6)at()的应用
//at()的应用 std::cout << "输入arrayInt at(3):" << arrayInt.at(3) << std::endl; try { std::cout << "输入arrayInt at(6):" << arrayInt.at(6) << std::endl; } catch (const std::exception&) { std::cout << "at(6)操作异样" << std::endl; }
后果如下:
7)data()的应用
//data()的应用 int *pData = arrayInt.data(); for (int i = 0; i < arrayInt.size(); i++) { std::cout << "输入arrayInt[:" << i << "]=" << *pData++ << std::endl; }
后果如下:
8)fill()的应用
//fill()的应用 arrayInt.fill(8); for (int i = 0; i < arrayInt.size(); i++) { std::cout << "输入arrayInt[" << i << "]=" << arrayInt[i] << std::endl; }
后果如下:
9)swap的应用
std::array<int, 5> arrayInt4; arrayInt.swap(arrayInt4); for (int i = 0; i < arrayInt4.size(); i++) { std::cout << "输入arrayInt4[" << i << "]=" << arrayInt4[i] << std::endl; }
后果如下:
10)crbegin()的应用
std::array<int, 5>::const_reverse_iterator arrayRe = arrayInt.crbegin(); std::cout << "输入arrayInt crbegin:" << *arrayRe << std::endl;
后果如下:
三、array随机拜访迭代器
在 array 容器的模板类中,和随机拜访迭代器相干的成员函数有:
begin()
end()
rbegin()
rend()
cbegin()
cend()
crbegin()
crend()
具体的性能如下:
依据它们的性能并结合实际场景的须要,这些成员函数通常是成对应用的,即 begin()/end()、rbegin()/rend()、cbegin()/cend()、crbegin()/crend() 各自成对搭配应用,其中 begin()/end() 和 cbegin()/cend()、rbegin()/rend() 和 crbegin()/crend() 的性能大抵是雷同的。
留神:
在应用反向迭代器进行 ++ 或 -- 运算时,++ 指的是迭代器向左挪动一位,-- 指的是迭代器向右挪动一位,即这两个运算符的性能也“调换”了,即反向迭代器以逆序的形式解决元素。
四、array容器拜访元素的几种形式
1、容器名[]
相似于C++中拜访数组元素的形式,须要留神的是:这种形式不会查看边界,所以能够存在索引越界的问题,因而不举荐应用这种办法。
重载[]时没有实现边界查看的起因:性能问题。每次拜访元素,都去查看索引值,会产生很多开销。
2、at()
为了无效防止越界拜访的问题,可应用array容器提供的at()成员函数
如设置索引地位4的值:
values.at (4) = values.at(3) + 2*values.at(1);
当传给at()的值是一盒越界值时,会抛出异样,为了防止程序解体,此处能够加异样机制解决。
3、data()
通过调用该函数能够失去指向容器首个元素的指针。通过该指针,咱们能够取得容器中的各个元素。示例代码中有,这里不再阐明
4、遍历容器
下面的办法是拜访单个元素的,如果要拜访容器中多个元素要怎么做呢?
首先能够通过size()获取容器的大小,在遍历容器取出元素即可