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