前言
本文是熊猫练习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 使用最多,不过知道了这些迭代器的使用方法,那么以后在写程序时遇到了那就是自己不想使用,而不是因为不了解而不会使用了,哈哈,希望能给正在看文章的你提供帮助。