Как удалить элементы из 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 ответов


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

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

по первому условию мы уверены, что iter не будет признан недействительным в любом случае, так как копия iter будет передано в стирание, но наш iter уже увеличивается, прежде чем вызвать erase.

в C++11 код будет похож на

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