stl list erase

典型错误

1
2
3
for(list::iterator it=li.begin();it!=li.end();it++){
li.erase(it);
}
问题:该程序不能跳出循环
原因:li.erase(it);每次做erase时都有可能使迭代器失效,it++就发生错误了。可以参见effective stl一书。所有容器做erase操作时都有可能使迭代器失效。

因为,当list执行erase函数后,会删除对应it的元素,这时迭代器it自动更新为下一个元素的地址(下一个指删除元素的下一个)。这时再执行it++,就会把

迭代器it指向删除元素的下下个,导致最终失效,因为跳过一个元素。

正确写法有:

1
2
3
4
5
6
7
8
9
10
while{ it!= li.end(); ){
if (*it % 2)
{
li.erase(it++); //在删除it还在时,对其++
}
else
{
it++;
}
}
 或者:

复制代码
while{ it!= li.end(); ){
if (*it % 2)
{
it=li.erase(it); //erase函数返回值为删除元素的下一个元素的迭代器(其实就是一个指针),把它赋值给it,就相当于++了。我更喜欢第一种写法。
}
else
{
it++;
}
}
复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值