STL 中的迭代器失效的问题

本文深入探讨了C++ STL容器中迭代器失效的原因,特别是在遍历过程中进行元素删除和插入操作时的情况。通过具体代码示例,展示了如何正确处理迭代器失效问题,避免程序崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值