Как удалить элементы из 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
будет передана в erase, но нашаiter
уже инкрементирована, прежде чем erase будет вызван.В C++11 код будет выглядеть как
for(set<T>::iterator iter = s.begin(); iter != s.end();) { if(/*some condition*/) { iter = s.erase(iter); } else { ++iter; } }