如何从c ++中的set <int>中删除所有偶数整数

Qui*_*ncy 10 c++ set stdset

我是C++的新手.我想知道经验丰富的程序员是如何做到这一点的.

是)我有的:

set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);

for(set<int>::iterator itr = s.begin(); itr != s.end(); ++itr){
if (!(*itr % 2))
    s.erase(itr);
}
Run Code Online (Sandbox Code Playgroud)

当然,它不起作用.因为itr在擦除后会递增.这是否意味着Itr必须在每次擦除集合中的元素后指向集合的开头?

pm1*_*100 16

 for(set<int>::iterator itr = s.begin(); itr != s.end(); ){
  if (!(*itr % 2))
      s.erase(itr++);

  else ++itr;
 }
Run Code Online (Sandbox Code Playgroud)

Scott Myers的有效STL

  • 外部允许`itr ++`,但是当值未被使用时,`++ it`通常是可取的,原因是任何人在每次进行操作时都很乏味;-)在这种情况下,忽略它可能更好通常的良好做法并编写`itr ++`,只是因为如果两种情况下代码相同,代码读取会稍微平滑一些. (5认同)

Ter*_*fey 11

从std :: set中删除元素只会使指向该元素的迭代器失效.

在擦除目标元素之前获取下一个元素的迭代器.


Mik*_*our 8

你不需要回到起点.set::erase只会使引用被删除项的迭代器无效,所以你只需要在删除之前复制迭代器和增量:

for(set<int>::iterator itr = s.begin(); itr != s.end();)
{
    set<int>::iterator here = itr++;
    if (!(*here % 2))
        s.erase(here);
}
Run Code Online (Sandbox Code Playgroud)