std::vector::erase
удаляет элемент (ы) в заданном диапазоне [first, last)
или в заданной позиции (версия, которую вы используете) и вызывает оператор присваивания для каждого элемента после удаленного элемент, чтобы «сдвинуть его вниз».
Рассмотрим std::vector
, который выглядит следующим образом:
[ a0 | a1 | a2 | a3 | a4 | a5 | a6 ]
На первой итерации l oop вы стираете элемент в вектор в позиции 0, который преобразует вектор следующим образом:
[ a0 | a1 | a2 | a3 | a4 | a5 | a6 ] --> [ a1 | a2 | a3 | a4 | a5 | a6 ]
^
|
erase at position 0
На второй итерации l oop вы стираете элемент вектора в позиции 1, который преобразует вектор следующим образом:
[ a1 | a2 | a3 | a4 | a5 | a6 ] --> [ a1 | a3 | a4 | a5 | a6 ]
^
|
erase at position 1
Обратите внимание, что мы «пропустили» элемент a1
, который изначально находился в позиции 1 в векторе.
Поскольку каждая итерация l oop представляет собой комбинацию:
- Стирание элемента (смещение всего над ним вниз) и
- Увеличение индекса
Мы будем пропускать каждый элемент, пока не достигнем конца (или далее).
Если вы хотите стереть канун ry элемент в std::vector
, у вас есть несколько вариантов.
Вы можете настроить вашу переменную l oop всякий раз, когда вы найдете элемент для удаления. Поскольку все элементы смещены вниз на один, вы хотите сместить вашу переменную l oop на единицу , если вы что-то сотрете.
for (int i = 0; i < myvector.size(); ++i)
{
myvector.erase(myvector.begin() + i);
// if we erased an element, decrement the loop variable
--i;
}
Если вы знаете диапазон элементов, который вы Если вы хотите erase
, вы можете позвонить erase
в этом диапазоне:
myvector.erase(myvector.begin(), myvector.end());
Если вы хотите erase
всех элементов в vector
, вы можете позвонить clear
.
myvector.clear();
Если вы хотите удалить все элементы, которые соответствуют определенным критериям поиска, вы можете использовать идиому remove
- erase
. Мы используем remove
, чтобы переместить все элементы, которые соответствуют критериям (удаления), в конец контейнера (но фактически не удаляют их - я знаю, что это интуитивно понятно) remove
возвращает итератор в начало этих «удаленных» элементы. Затем вы вызываете erase
в диапазоне этого возвращенного итератора до конца старого контейнера.
// This will remove/erase all elements in the vector that are greater than 5
myvector.erase(std::remove_if(myvector.begin(),
myvector.end(),
[](int x){return x > 5;}),
myvector.end());