У меня есть контейнер и я хотел бы удалить элементы на основе предиката. erase_if
звучит знакомо, но я не могу найти его в C++. Какое название и где оно определено? Я хотел бы использовать его с лямбда в VS10.
Где erase_if?
Ответ 1
Вероятно, вы ищете std::remove_if
в шаблоне, например:
vec.erase(std::remove_if(vec.begin(), vec.end(), predicate), vec.end());
Ответ 2
Я предполагаю, что вы думаете о remove_if
, который берет предикат, чтобы определить, должен ли элемент быть удален.
remove_if
возвращает итератор, указывающий на начало элементов, которые нужно удалить в контейнере. Чтобы удалить их, вам нужно использовать erase
:
container.erase(remove_if(container.start(), container.end(), pred), container.end())
Либо это, либо, возможно, вы ошибочно напомнили алгоритм copy_if
? Что-то ушло из стандарта, но было написано - и реализовано - в Эффективный STL.
Ответ 3
Это в Библиотеке Основы v2, а вскоре и в С++ 20.
Ответ 4
На самом деле существует метод под названием erase_if
в библиотеке Boost для контейнеров-указателей.
Ответ 5
Я считаю, что вы хотите remove_if
Ответ 6
Существует list::remove_if
, но не для всех классов контейнеров. remove_if
также существует как алгоритм, который можно использовать с итераторами, которые вы можете получить от begin()
и end()
.