共计 3811 个字符,预计需要花费 10 分钟才能阅读完成。
一、前言
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()获取容器的大小,在遍历容器取出元素即可