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 | - | пара итераторов, задающих диапазон удаляемых элементов |
Возвращаемое значение
Итератор, следующий за последним удалённым элементом.
pos указывает на последний элемент, возвращается итератор end().last == end(), возвращается обновлённый итератор end().[first, last) является пустым диапазоном, возвращается last.Исключения
Не генерирует исключений, если только исключение не генерируется оператором присваивания T.
Сложность
Линейная: количество вызовов деструктора T равно количеству удалённых элементов; оператор присваивания T вызывается столько раз, сколько элементов в векторе находится после удалённых элементов.
Примечания
Если элементы контейнера нужно удалить на основе предиката, то вместо обхода контейнера с вызовом унарной операции erase обычно используют перегрузку, принимающую диапазон итераторов, вместе с std::remove()/std::remove_if(), чтобы свести к минимуму количество перемещений оставшихся (неудалённых) элементов. Это идиома erase-remove. std::erase_if() заменяет идиому erase-remove.
Пример
#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]
См. также
|
(C++26) | удаляет все элементы, удовлетворяющие заданным критериям (шаблон функции) |
| очищает содержимое (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/inplace_vector/erase