一、迭代器
迭代器(iterator)是一个可以对其执行类似指针的操作的对象(如:解除引用(operator*())和递增(operator++())),我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。
在这里并非4个字节,而是12个。
二、序列式容器迭代器失效
对于序列式容器,例如vector、deque、list;由于序列式容器是组合式容器,当当前元素的iterator被删除后,其后的所有元素的迭代器都会失效,这是因为vector,deque都是连续存储的一段空间,所以当对其进行erase操作时,其后的每一个元素都会向前移一个位置。
#include<iostream>
using namespace std;
#include<vector>
void VectorTest()
{
vector<int> vec;
for (int i = 0; i < 5; i++)
{
vec.push_back(i);
}
vector<int>::iterator it;
cout << sizeof(it) << endl;
for (it = vec.begin(); it != vec.end(); it++)
{
if (*it > 2)
vec.erase(it);//此处会发生迭代器失效
}
/*for (it = vec.begin(); it != vec.end(); it++)
{
//erase()返回下一个有效迭代器
if (*it > 2)
{
it = vec.erase(it);
it--;
}
}*/
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << " ";
cout << endl;
}
int main()
{
VectorTest();
system("pause");
return 0;
}
三、关联式容器迭代器失效
对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。erase迭代器只是被删元素的迭代器失效,但是返回值为void,所以要采用erase(iter++)的方式删除迭代器。
#include<iostream>
#include<map>
using namespace std;
void mapTest()
{
map<int, int>m;
for (int i = 0; i < 10; i++)
{
m.insert(make_pair(i, i + 1));
}
map<int, int>::iterator it;
for (it = m.begin(); it != m.end(); it++)
{
if ((it->first) > 5)
m.erase(it);//当前迭代器失效
}
/*for (it = m.begin(); it != m.end(); it++)
{
if ((it->first) > 5)
{
//erase()返回值为void,所以要采用erase(iter++)的方式删除迭代器
m.erase(it++);
it--;
}
}*/
for (it = m.begin(); it != m.end(); it++)
{
cout << (*it).first << " ";
}
cout << endl;
}
int main()
{
mapTest();
system("pause");
return 0;
}