Стандарт STL определяет, что при стирании на контейнерах, таких как std :: deque, std :: list etc, итераторы недействительны.Проблема с недействительностью итераторов STL при вызове erase
Мой вопрос заключается в следующем, предполагая список целых чисел, содержащихся в std :: deque, и пару указателей, указывающих диапазон элементов в std :: deque, что является правильным способом удаления всех четных элементов ?
До сих пор у меня есть следующие, однако проблема в том, что предполагаемый конец аннулируется после стирания:
#include <cstddef>
#include <deque>
int main()
{
std::deque<int> deq;
for (int i = 0; i < 100; deq.push_back(i++));
// range, 11th to 51st element
std::pair<std::size_t,std::size_t> r(10,50);
std::deque<int>::iterator it = deq.begin() + r.first;
std::deque<int>::iterator end = deq.begin() + r.second;
while (it != end)
{
if (*it % 2 == 0)
{
it = deq.erase(it);
}
else
++it;
}
return 0;
}
Исследование как станд :: реализуется remove_if, кажется, что это очень дорого копия/смена процесса продолжается.
Есть ли более эффективный способ достижения выше, не все копии/сдвигает
В целом удаление/удаление элемента дороже, чем замена его следующим го значения в последовательности (где п число элементов, удаленных/удалены до сих пор)
Примечание: ответы должны взять на себя размер последовательности довольно велик, + 1mil элементы и что в среднем 1/3 элементов будет для е rasure.
Я считаю, что `deque :: erase` делает недействительными все итераторы. – 2010-12-04 02:21:07
Erasure не влияет на итераторы/указатели на не стертые элементы в std :: list. Пожалуйста, обратитесь к этому списку: http://stackoverflow.com/questions/6438086/iterator-invalidation-rules/6438087 для полных правил недействительности. – metamorphosis 2016-04-14 04:16:56