как удалить все четные целые числа из набора в c++
Я новичок в C++. Я хотел бы знать, как опытные программисты делают это.
Что у меня есть:
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
for(set<int>::iterator itr = s.begin(); itr != s.end(); ++itr){
if (!(*itr % 2))
s.erase(itr);
}
И конечно, это не работает. потому что itr увеличивается после его стирания. означает ли это, что Itr должен указывать на начало набора каждый раз после удаления элемента из набора?
4 ответа:
for(set<int>::iterator itr = s.begin(); itr != s.end(); ){ if (!(*itr % 2)) s.erase(itr++); else ++itr; }
Эффективный STL Скотта Майерса
Удаление элемента из std:: set только делает недействительными итераторы, указывающие на этот элемент.
Получить итератор к следующему элементу перед удалением целевого элемента.
Вам не нужно возвращаться к началу.
set::erase
только делает недействительными итераторы, которые ссылаются на стираемый элемент, поэтому вам просто нужно скопировать итератор и увеличить перед стиранием:for(set<int>::iterator itr = s.begin(); itr != s.end();) { set<int>::iterator here = itr++; if (!(*here % 2)) s.erase(here); }
Лучший способ - использовать комбинацию remove_if и erase
s.erase(remove_if(s.begin(), s.end(), evenOddFunctor), s.end())
Это будет полезно. http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Erase-Remove
Также см. эффективное использование STL Скотт Мейерс
Edit
: хотя мое решение неверно, я не удаляю его. Это может быть хорошим уроком для кого-то вроде меня, кто не знает о изменяемых / неизменяемых итераторах