У меня есть контейнер и я хотел бы удалить элементы на основе предиката. 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().