how to remove all even integers from set<int> in c++

时光总嘲笑我的痴心妄想 提交于 2019-12-18 05:53:15

问题


I'm new to C++. I'd like to know how experienced coders do this.

what I have:

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

and of course, it doesn't work. because itr is incremented after it is erased. does it mean Itr has to point to the begin of the set everytime after i erase the element from the set?


回答1:


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

  else ++itr;
 }

effective STL by Scott Myers




回答2:


Erasing an element from std::set only invalidates iterators pointing to that element.

Get an iterator to the next element before erasing the target element.




回答3:


You don't need to go back to the start. set::erase only invalidates iterators that refer to the item being erased, so you just need to copy the iterator and increment before erasing:

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



回答4:


The best way is to use the combination of remove_if and erase

s.erase(remove_if(s.begin(), s.end(), evenOddFunctor), s.end())

This will be helpful http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Erase-Remove

Also Refer to effective STL by scott meyers

Edit: Although my solution is wrong i am not deleting it. It might be a good learning for someone like me who does not about mutable/immutable iterators



来源:https://stackoverflow.com/questions/2088495/how-to-remove-all-even-integers-from-setint-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!