C++ STL 库中的容器迭代器相信大家都不陌生,用一个迭代器遍历一个容器的通用做法
如下:
vector<int>::iterator it = vec.begin();
for(; it!=vec.end(); ++it)
{
cout<<*it<<" ";
}
cout<<endl;
那么容器的迭代器什么时候就失效了呢?请看如下的两个例子,我们那vector来举例!
给一个 int 类型实例化的 vector 容器添加 20 个整数,然后删除里面所有的偶数,代码如下:
int main()
{
vector<int> vec;
for(int i=0; i<20; ++i)
{
vec.push_back(rand()%100);
}
vector<int>::iterator it = vec.begin();
while(it!=vec.end())
{
if(*it % 2 == 0)
{
vec.erase(it);
}
else
{
++it;
}
}
return 0;
}
大家运行一下上面的代码,会发现程序运行崩溃掉了,这就是迭代器失效的问题,当从一个容器删除一个元素后,从起始位置到当前删除位置的迭代器是正常的,但是从删除位置到末尾位置的迭代器都失效了!那当删除多个元素的时候,该怎么操作呢,对了,必须用 erase的返回值更新一些当前的迭代器变量,如下修改正确:
int main()
{
vector<int> vec;
for(int i=0; i<20; ++i)
{
vec.push_back(rand()%100);
}
vector<int>::iterator it = vec.begin();
while(it!=vec.end())
{
if(*it % 2 == 0)
{
it = vec.erase(it);
}
else
{
++it;
}
}
return 0;
}
同理,用迭代器循环遍历容器给容器连续添加元素,也会造成迭代器失效,与删除不同,当给容器添加一个元素时,所有的迭代器都失效了(因为随着元素的增加,容器底层的内存可能会扩容的,所有迭代器完全失效),如下例子,同学们可以自己修改正确,让程序正常运行:
//给 vec 容器的所有偶数元素位置添加一个 0
int main()
{
vector<int> vec;
for(int i=0; i<20; ++i)
{
vec.push_back(rand()%100);
}
vector<int>::iterator it = vec.begin();
for(;it!=vec.end(); ++it)
{
if(*it % 2 == 0)
{
vec.insert(it, 0);
++it;
}
}
return 0;
}