c++ - 在循环中使用迭代器删除 unordered_set 中的元素

标签 c++ unordered-set

请考虑以下代码:

Class MyClass 为自定义类:

class MyClass
{
public:
    MyClass(int v) : Val(v) {}
    int Val;
};

然后下面的代码将在调用 it = T.erase(it); 之后在循环中导致 Debug Assertion Failed:

unordered_set<MyClass*> T;
unordered_set<MyClass*>::iterator it;

for (int i=0; i<10; i++)
    T.insert(new MyClass(i));

for (it = T.begin(); it != T.end(); it++)
{
    if ( (*it)->Val == 5 )
        it = T.erase(it); // After this line executes, in the next loop, the error occurs.
}

如何解决,为什么? PS:我的环境:VS2010

最佳答案:

假设最后一个元素的 Val = 5。
it = T.erase(it) 被调用,it 被设置为 T.end()。
然后 it++ 被调用,这会导致错误,因为 it 已经设置为结束。
本质上…当您删除当前代码中的一个元素时,您最终会双倍推进迭代器。

你可以改用这样的东西:

for (it = T.begin(); it != T.end(); (*it)->Val == 5? it = T.erase(it) : ++it)
  ;

我通常是这样做的:

for (auto it = T.begin(); it != T.end(); )
{
    if ((*it)->value == 5) it = T.erase(it);
    else ++it;
}

如果擦除条件变得更复杂,这可能会提高可读性。

关于c++ - 在循环中使用迭代器删除 unordered_set 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23252386/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值