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