文章目录
- 1 类模板
- 2 begin()/end() 和 cbegin()/cend()
- 3 cbegin() 和 cend()
- 4 rbegin()/rend() 和 crbegin()/crend()
- 5 访问array容器中单个元素
- 参考
1 类模板
array 容器以类模板的形式定义在 头文件,并位于命名空间 std 中,如下所示:
namespace std{
template <typename T, size_t N>
class array;
}
在 array<T,N> 类模板中,T 用于指明容器中的存储的具体数据类型,N 用于指明容器的大小,需要注意的是,这里的 N 必须是常量,不能用变量表示。
演示:
#include <iostream>
//需要引入 array 头文件
#include <array>
using namespace std;
int main()
{
std::array<int, 4> values{};
//初始化 values 容器为 {0,1,2,3}
for (int i = 0; i < values.size(); i++) {
values.at(i) = i;
}
//使用 get() 重载函数输出指定位置元素
cout << get<3>(values) << endl;
//如果容器不为空,则输出容器中所有的元素
if (!values.empty()) {
for (auto val = values.begin(); val < values.end(); val++) {
cout << *val << " ";
}
}
}
注意,代码中的 auto 关键字,可以使编译器自动判定变量的类型。运行这段代码,输出结果为:
3
0 1 2 3
2 begin()/end() 和 cbegin()/cend()
#include <iostream>
//需要引入 array 头文件
#include <array>
using namespace std;
int main()
{
array<int, 5>values;
int h = 1;
auto first = values.begin();
auto last = values.end();
//初始化 values 容器为{1,2,3,4,5}
while (first != last)
{
*first = h;
++first;
h++;
}
first = values.begin();
while (first != last)
{
cout << *first << " ";
++first;
}
return 0;
}
输出结果为:
1 2 3 4 5
3 cbegin() 和 cend()
#include <iostream>
//需要引入 array 头文件
#include <array>
using namespace std;
int main()
{
array<int, 5>values{1,2,3,4,5};
int h = 1;
auto first = values.cbegin();
auto last = values.cend();
//由于 *first 为 const 类型,不能用来修改元素
//*first = 10;
//遍历容器并输出容器中所有元素
while (first != last)
{
//可以使用 const 类型迭代器访问元素
cout << *first << " ";
++first;
}
return 0;
}
此程序的第 14 行代码中,我们尝试使用 first 迭代器修改 values 容器中的值,如果取消注释并运行此程序,编译器会提示你“不能给常量赋值”,即 *first 是 const 类型常量,所以这么做是不对的。但 17~22 行代码遍历并访问容器的行为,是允许的。
4 rbegin()/rend() 和 crbegin()/crend()
反向迭代器用于以逆序的方式处理元素。例如:
#include <iostream>
//需要引入 array 头文件
#include <array>
using namespace std;
int main()
{
array<int, 5>values;
int h = 1;
auto first = values.rbegin();
auto last = values.rend();
//初始化 values 容器为 {5,4,3,2,1}
while (first != last)
{
*first = h;
++first;
h++;
}
//重新遍历容器,并输入各个元素
first = values.rbegin();
while (first != last)
{
cout << *first << " ";
++first;
}
return 0;
}
运行结果为:
1 2 3 4 5
可以看到,从最后一个元素开始循环,不仅完成了容器的初始化,还遍历输出了容器中的所有元素。结束迭代器指向第一个元素之前的位置,所以当 first 指向第一个元素并 +1 后,循环就结朿了。
在反向迭代器上使用 ++ 递增运算符,会让迭代器用一种和普通正向迭代器移动方向相反的方式移动。
当然,在上面程序中,我们也可以使用 for 循环:
for (auto first = values.rbegin(); first != values.rend(); ++first) {
cout << *first << " ";
}
crbegin()/crend() 组合和 rbegin()/crend() 组合的功能唯一的区别在于,前者返回的迭代器为 const 类型,即不能用来修改容器中的元素,除此之外在使用上和后者完全相同。
5 访问array容器中单个元素
1 使用at:
values.at (4) = values.at(3) + 2.O*values.at(1);
2 使用get
array 容器还提供了 get 模板函数,它是一个辅助函数,能够获取到容器的第 n 个元素。
#include <iostream>
#include <array>
#include <string>
using namespace std;
int main()
{
array<string, 5> words{ "one","two","three","four","five" };
cout << get<3>(words) << endl; // Output words[3]
//cout << get<6>(words) << std::endl; //越界,会发生编译错误
return 0;
}
运行结果为:
four
3 使用data()
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
参考
部分内容参考于C语言中文网;一个很不错的编程网站,建议大家多看看。