第三(2)课:array容器随机访问迭代器

40 阅读1分钟

一、概述

1、在 array 容器的模板类中,和随机访问迭代器相关的成员函数如表 1 所示

image.png

2、这些成员函数的具体功能如图 2 所示。

image.png 以上函数在实际使用时,其返回值类型都可以使用 auto 关键字代替,编译器可以自行判断出该迭代器的类型。

二、begin()/end() 和 cbegin()/cend()

1、array 容器模板类中的 begin() 和 end() 成员函数返回的都是正向迭代器,它们分别指向「首元素」和「尾元素+1」 的位置。在实际使用时,我们可以利用它们实现初始化容器或者遍历容器中元素的操作。

#include <iostream>
#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;
	}
}

2、需要注意的是,STL 标准库,不是只有 array 容器,当迭代器指向容器中的一个特定元素时,它们不会保留任何关于容器本身的信息,所以我们无法从迭代器中判断,它是指向 array 容器还是指向 vector 容器。

3、除此之外,array 模板类还提供了 cbegin() 和 cend() 成员函数,它们和 begin()/end() 唯一不同的是,前者返回的是 const 类型的正向迭代器,这就意味着,有 cbegin() 和 cend() 成员函数返回的迭代器,可以用来遍历容器内的元素,也可以访问元素,但是不能对所存储的元素进行修改。

#include <iostream>
#include <array>

using namespace std;

int main() {
	array<int, 5> values{ 1,2,3,4,5 };
	int h = 1;
	auto first = values.begin();
	auto last = values.end();

	//因为*first为const元素,所以*first = 10要报错。

	//遍历容器,并输出所有元素
	while (first != last) {
		cout << *first << " ";
		++first;
	}
	return 0;
}

三、rbegin()/rend() 和 crbegin()/crend()

1、array 模板类中还提供了 rbegin()/rend() 和 crbegin()/crend() 成员函数,它们每对都可以分别得到指向最一个元素和第一个元素前一个位置的随机访问迭代器,又称它们为反向迭代器。

2、需要注意的是,在使用反向迭代器进行 ++ 或 -- 运算时,++ 指的是迭代器向左移动一位,-- 指的是迭代器向右移动一位,即这两个运算符的功能也“互换”了。

3、反向迭代器用于以逆序的方式处理元素

#include <iostream>
#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;
}

当然,在上面程序中,我们也可以使用 for 循环

for(auto first = values.rbegin(); first != values.rend(); ++frist){
    cout<<*first<<" ";
}

4、crbegin()/crend() 组合和 rbegin()/crend() 组合的功能唯一的区别在于,前者返回的迭代器为 const 类型,即不能用来修改容器中的元素,除此之外在使用上和后者完全相同。