【问题标题】:How to remove elements from an std::set while iterating over it如何在迭代时从 std::set 中删除元素
【发布时间】:2014-01-04 19:40:44
【问题描述】:

如何在迭代 std::set 时删除元素

我的第一次尝试是这样的:

set<T> s;

for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) {
    //Do some stuff
    if(/*some condition*/)
        s.erase(iter--);
}

但是如果我们想从集合中删除第一个元素,这是有问题的,因为iter-- 使迭代器无效。

执行此操作的标准方法是什么?

【问题讨论】:

    标签: c++ stl coding-style set


    【解决方案1】:

    标准方法是做类似的事情

    for(set<T>::iterator iter = s.begin(); iter != s.end();)
    {
       if(/*some condition*/)
       {
          s.erase(iter++);
       }
       else
       {
          ++iter;
       }
    }
    

    通过第一个条件,我们确定iter 无论如何都不会失效,因为iter 的副本将被传递到erase,但我们的iter 在调用erase 之前已经递增。

    在 C++11 中,代码会是这样的

    for(set<T>::iterator iter = s.begin(); iter != s.end();)
    {
       if(/*some condition*/)
       {
          iter = s.erase(iter);
       }
       else
       {
          ++iter;
       }
    }
    

    【讨论】:

    • 第一段代码失败了一个断言,即迭代器在 Visual Studio 中不兼容。无论如何,正如您在代码中指出的那样,std::erase 返回新的迭代器。
    猜你喜欢
    • 2011-02-21
    • 2011-03-22
    • 2019-01-15
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多