前言

本文是熊猫练习stl一段时间之后,对vector容器的各种迭代器产生了很大的好奇心,于是对它们进行了以下探究。
在这里插入图片描述
从图中我们可以知道,vector一个有四组不同的迭代器,
其中,字符 ‘c’ 是 const 常量的意思,既所指向的对象不能修改
字符 ’ r ’ 是 reverse 反转的意思,既从后往前遍历数据。
注意:rbegin() 迭代器的操作和它的名字一样:是反向的,与我们平时的理解不一样,eg:
rit = rbegin(); rit++;
这里的rit相当于指向最后一个位置的数据的指针, rit++;表示指针向后走一步,
按照我们平时的理解:此时rit指向最后一个数据的下一个位置,
然而实际上:此时rit指向最后一个数据左边的位置,也就是 “2022”的第二个 2,
这也就是reverse 反转的特点,迭代器从后往前进行遍历。

void test06()
{
	vector<int>v1;
	for (int i = 0; i < 10; ++i)
	{
		v1.push_back(i);
	}
	//  不同的返回值需要使用对应的迭代器接收
	vector<int>::iterator it;      //  迭代器
	vector<int>::const_iterator cit; //  常量迭代器
	vector<int>::reverse_iterator rit; //  反向迭代器
	vector<int>::const_reverse_iterator crit;  // 常量反向迭代器
	// begin
	cout << "begin:" << endl;
	it = v1.begin();
	cout << "*it = " <<*it << endl;
	cout << "改变迭代器的指向" << endl;
	++it;
	cout << "*it = " << *it << endl;
	cout << "通过迭代器改变原数据" << endl;
	*it += 2;
	cout << "*it = " << *it << endl << endl;
	*it -= 2;  //  数据复原

	//cbegin
	cit = v1.cbegin();
	cout << "cbegin:" << endl;
	cout << "*cit = " << *cit << endl ;
	cout << "改变常量迭代器的指向" << endl;
	++cit;
	cout << "*cit = " << *cit << endl;
	cout << "不能通过常量迭代器更改原数据" << endl << endl;
	/**cit += 2;     // 错误  常量不可改变
	cout << "*cit+2 = " << *cit+2 << endl;*/

	// rbegin
	 rit = v1.rbegin();
	 cout << "rbegin:" << endl;
	 cout << "*rit = " << *rit << endl;
	 cout << "改变反向迭代器的指向" << endl;
	 ++rit;   //  特别注意
	 cout << "*rit = " << *rit << endl;
	 cout << "通过反向迭代器改变原数据" << endl;
	 *rit += 2;
	 cout << "*rit = " << *rit << endl << endl;
	 *rit -= 2;  //  数据复原

	// crbegin
	 crit = v1.crbegin();
	 cout << "crbegin:" << endl;
	 cout << "*crit = " << *crit << endl;
	 cout << "改变常量反向迭代器的指向" << endl;
	 ++crit;   //  特别注意
	 cout << "*crit = " << *crit << endl;
	 cout << "不能通过常量反向迭代器改变原数据" << endl;
	 //cout << "通过迭代器改变原数据" << endl;
	 //*crit += 2;   //  错误  常量不可改变
	 //cout << "*crit = " << *crit << endl << endl;
	 //*crit -= 2;
}

运行示例:这里是引用

举个栗子:

void Print(int v)
{
	cout << v << ' ';
}

void test07()
{
	vector<int>v1;
	for (int i = 0; i < 10; ++i)
	{
		v1.push_back(i);
	}

	vector<int>v2(v1);  // 拷贝构造
	vector<int>v3(v1);  // 拷贝构造

	cout << "v1" << endl;
	cout << "原数据:" << endl;
	for_each(v1.begin(), v1.end(), Print);
	cout << endl;
	cout << "反向输出的三种方法" << endl;
	cout << "1.排逆序,输出" << endl;
	sort(v1.begin(), v1.end(), greater<int>());
	for_each(v1.begin(), v1.end(), Print);
	cout << endl << endl;

	cout << "2.数据进行reverse,输出" << endl;
	reverse(v2.begin(), v2.end());
	for_each(v1.begin(), v1.end(), Print);
	cout << endl << endl;

	cout << "3.不改变原数据,传反转迭代器" << endl;
	for_each(v3.rbegin(), v3.rend(), Print);
	cout << endl << endl;
}

结果:
在这里插入图片描述

总结

最初参考文章:c++ vector cbegin的用法及代码演示
本文主要是兴趣使然,在实际应用中还是 begin 和 end 使用最多,不过知道了这些迭代器的使用方法,那么以后在写程序时遇到了那就是自己不想使用,而不是因为不了解而不会使用了,哈哈,希望能给正在看文章的你提供帮助。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐