std::inplace_vector<T,N>::erase
constexpr iterator erase( const_iterator pos );
|
(1) | (начиная с C++26) |
constexpr iterator erase( const_iterator first, const_iterator last );
|
(2) | (начиная с C++26) |
Удаляет указанные элементы из контейнера.
pos.[first, last).Итераторы (включая итератор end()) и ссылки на элементы, находящиеся на или после точки удаления, становятся недействительными.
Итератор pos должен быть допустимым и разыменовываемым. Таким образом, итератор end() (который допустим, но не разыменовываем) не может использоваться в качестве значения для pos.
Итератору first не обязательно быть разыменовываемым, если first == last: удаление пустого диапазона является пустой операцией.
Параметры
| pos | - | итератор на удаляемый элемент |
| first, last | - | пара итераторов, определяющих диапазон удаляемых элементов |
| Требования к типам | ||
-
T
не является
MoveAssignable
, поведение не определено.
|
||
Возвращаемое значение
Итератор, следующий за последним удалённым элементом.
[
first
,
last
)
является пустым диапазоном, то возвращается
last
.
Исключения
Не вызывает исключений, если только исключение не вызвано оператором присваивания
T
.
Сложность
Линейная: количество вызовов деструктора
T
равно количеству удаленных элементов, оператор присваивания
T
вызывается количество раз, равное количеству элементов в векторе после удаленных элементов.
Примечания
Когда элементы контейнера необходимо удалить на основе предиката, вместо итерации по контейнеру и вызова унарного erase, обычно используется перегрузка диапазона итераторов с std::remove()/std::remove_if() чтобы минимизировать количество перемещений оставшихся (неудаленных) элементов, — это идиома стирания-удаления.
std::erase_if() заменяет идиому стирания-удаления.
Пример
#include <inplace_vector>
#include <print>
int main()
{
std::inplace_vector<int, 26> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::println("{}", v);
v.erase(v.begin());
std::println("{}", v);
v.erase(std::next(v.begin(), 2), std::next(v.begin(), 5));
std::println("{}", v);
// Erase all even numbers
for (auto it{v.begin()}; it != v.end();)
if (*it % 2 == 0)
it = v.erase(it);
else
++it;
std::println("{}", v);
}
Вывод:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 6, 7, 8, 9]
[1, 7, 9]
Смотрите также
|
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции) |
|
|
очищает содержимое
(публичная функция-член) |