【问题标题】:How to iterate over a STL set and selectively remove elements?如何遍历 STL 集并有选择地删除元素?
【发布时间】:2010-06-16 10:32:55
【问题描述】:

以下代码无法正常工作。应该如何正确完成?

for (std::set<Color>::iterator i = myColorContainer.begin();
            i!=myColorContainer.end();
            ++i)
{
    if ( *i  == Yellow)
    {
        DoSomeProccessing( *i );
        myColorContainer.erase(i);
    }
}

【问题讨论】:

    标签: c++ stl set


    【解决方案1】:

    试试:

    for(std::set<Color>::iterator it = myColorContainer.begin(); 
        it != myColorContainer.end();) { // note missing it++
         if( (*it) == Yellow ) {
            DoSomeProcessing(*it);
            myColorContainer.erase(it++); // post increment (original sent to erase)
         }
         else {
           ++it; // more efficient than it++;
         }
    }
    

    【讨论】:

    • 这也行不通。您应该再次将erase的返回值分配给它。
    • 返回的迭代器是违反标准的微软特定实现:msdn.microsoft.com/en-us/library/8h4a3515%28VS.80%29.aspx。果然,你需要在擦除之后递增迭代器。
    • 如果您不能使用特定于 m$ 的实现并且需要使用循环,则此解决方案是完美的。如果您不需要使用循环,Viktor 的选项会更好。感谢您的精彩回答。你帮了大忙。
    【解决方案2】:

    在处理集合时不需要循环。

    std::set<Color>::iterator it = myColorContainer.find(Yellow);
    if (it != it.myColorContainer.end()){
      DoSomeProcessing(*it);
      myColorContainer.erase(it);
    }
    

    【讨论】:

    • 代码符合标准。我同意@Viktor Sehr,这将是从集合中删除元素的首选方式。然而,问题是如何让代码 sn-p 工作。
    • @daramarak:我想你在我编辑代码时回答了(在我的第一篇文章中认为这是一个 std::vector)
    【解决方案3】:
    for (std::set<Color>::iterator i = myColorContainer.begin();
                i!=myColorContainer.end(); /* No i++ */)
    {
        if ( *i  == Yellow)
        {
            DoSomeProccessing( *i );
            std::set<Color>::iterator tmp = i;
            ++i;
            myColorContainer.erase(tmp);
        }
        else {
            ++i;
        }
    }
    

    一旦您使用++i 转到下一条消息,它就保证是有效的-std::set 的属性,即插入元素上的迭代器永远不会失效,除非该元素 被删除。

    所以现在您可以安全地删除以前的条目了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 2014-04-12
      相关资源
      最近更新 更多