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/

相关推荐

  1. C++通过循环删除字典元素及UB

    2024-05-12 13:14:07       18 阅读
  2. C#

    2024-05-12 13:14:07       51 阅读
  3. 使用

    2024-05-12 13:14:07       5 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-12 13:14:07       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-12 13:14:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-12 13:14:07       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-12 13:14:07       20 阅读

热门阅读

  1. proxySQL 安装与配置

    2024-05-12 13:14:07       11 阅读
  2. Day45 初识HTML

    2024-05-12 13:14:07       11 阅读
  3. 关于python内置inspect

    2024-05-12 13:14:07       14 阅读
  4. iOS 生成SSH Key

    2024-05-12 13:14:07       13 阅读
  5. 记录一个git无法push的问题

    2024-05-12 13:14:07       16 阅读
  6. linux命令

    2024-05-12 13:14:07       12 阅读
  7. 整除C++

    整除C++

    2024-05-12 13:14:07      12 阅读