how to remove all even integers from set in c++

前端 未结 4 1891
梦谈多话
梦谈多话 2020-12-19 02:37

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

what I have:

set s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);         


        
相关标签:
4条回答
  • 2020-12-19 02:50

    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

    0 讨论(0)
  • 2020-12-19 02:57

    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);
    }
    
    0 讨论(0)
  • 2020-12-19 03:03
     for(set<int>::iterator itr = s.begin(); itr != s.end(); ){
      if (!(*itr % 2))
          s.erase(itr++);
    
      else ++itr;
     }
    

    effective STL by Scott Myers

    0 讨论(0)
  • 2020-12-19 03:06

    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.

    0 讨论(0)
提交回复
热议问题