Стандарт STL определяет, что когда стирание происходит в контейнерах, таких как std :: deque, std :: list и т.д., итераторы становятся недействительными.
Мой вопрос заключается в следующем, предполагая список целых чисел, содержащихся в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;
}
Изучая, как реализован std :: remove_if, кажется, что происходит очень дорогостоящий процесс копирования / переключения вниз.
Существует ли более эффективный способ достижения вышеуказанного без всех копий / сдвигов
Как правило, удаление / удаление элемента обходится дорожечем заменить его следующим n-ным значением в последовательности (где n - количество удаленных / удаленных элементов)
Примечание: Ответы должны принимать последовательностьразмер довольно велик, + 1 мил элементов и что в среднем 1/3 элементов будет на стирание.