如何迭代STL集并有选择地删除元素?

时间:2010-06-16 10:32:55

标签: c++ stl set

以下代码无法正常运行。该如何正确完成?

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

3 个答案:

答案 0 :(得分:7)

尝试:

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++;
     }
}

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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的属性,插入元素上的迭代器永远不会失效,除非元素 被删除了。

所以现在你可以安全地删除之前的条目。