目录
正向迭代器:
iterator:正向迭代器(访问元素是从第一个访问到最后一个)
const_iterator:常量的正向迭代器,只能读,而不能写
int main()
{
vector<int> vec;
for (int i = 0; i < 20; ++i)
{
vec.push_back(rand() % 20);
}
/*
const_iterator 是基类
iterator 是派生类
class const_iterator
{
public:
const T& operator* (){return *_ptr;}
}
class iterator
{
public:
T& operator* (){return *_ptr;}
}
*/
//vector<int>::iterator it1 = vec.begin();
auto it1 = vec.begin();
//vector<int>::const_iterator it1 = vec.begin();
for (; it1 != vec.end(); ++it1) {
cout << *it1 << " "; //可读
if (*it1 % 2 == 0) {
*it1 = 0; //可写
}
}
cout << endl;
return 0;
}
反向迭代器:
rbegin():返回的是最后一个元素的反向迭代器表示
rend:返回的是首元素的前驱位置的迭代器的表示reverse_iterator
const_reverse_iterator
#include <iostream> #include <vector> using namespace std; int main() { vector<int> vec; for (int i = 0; i < 20; ++i) { vec.push_back(rand() % 20); } auto rit = vec.rbegin(); for (; rit != vec.rend(); ++rit) { cout << *rit << " "; } cout << endl; for (int v : vec) { cout << v << " "; } cout << endl; return 0; }
迭代器失效问题
迭代器不允许一边读一边修改,
当通过迭代器插入一个元素,所有迭代器都失效
当通过迭代器删除一个元素,当前删除位置后面所有的元素的迭代器都失效
失效原因:
- 容器添加或者删除元素时,可能会改变容器的内存地址,导致原来保存的迭代器指向的地址已经不再是有效的地址。
- 对于vector、string等使用动态数组实现的容器,在容器中添加或删除元素时,可能会导致内存重新分配,原来保存的迭代器指向的地址已经不再是有效的地址
如何处理:
当通过迭代器更新容器元素以后,要及时对迭代器进行更新,insert/erase方法都会返回新位置的迭代器
对于vector、string等使用动态数组实现的容器,可以使用reserve()预分配足够的空间,避免内存重分配导致迭代器失效。
使用迭代器的前置版本(++it),前置版本返回的是指向容器元素的引用,而后置版本返回的是指向容器元素的副本;或者在执行插入和删除操作前,先保存迭代器,执行完操作后重新定位迭代器。