Как удалить элементы из std:: set во время итерации по нему


Как я могу удалить элементы из std::set, повторяя его

Моя первая попытка выглядит так:

set<T> s;

for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) {
    //Do some stuff
    if(/*some condition*/)
        s.erase(iter--);
}
Но это проблематично, если мы хотим удалить первый элемент из множества, потому что iter-- делает итератор недействительным.

Каков стандартный способ сделать это?

1 10

1 ответ:

Стандартный способ-сделать что-то вроде

for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
   if(/*some condition*/)
   {
      s.erase(iter++);
   }
   else
   {
      ++iter;
   }
}
По первому условию мы уверены, что iter не будет недействительным в любом случае, так как копия iter будет передана в erase, но наша iter уже инкрементирована, прежде чем erase будет вызван.

В C++11 код будет выглядеть как

for(set<T>::iterator iter = s.begin(); iter != s.end();)
{
   if(/*some condition*/)
   {
      iter = s.erase(iter);
   }
   else
   {
      ++iter;
   }
}