Где erase_if?

У меня есть контейнер и я хотел бы удалить элементы на основе предиката. erase_if звучит знакомо, но я не могу найти его в C++. Какое название и где оно определено? Я хотел бы использовать его с лямбда в VS10.

Ответ 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.

Ответ 5

Я считаю, что вы хотите remove_if

Ответ 6

Существует list::remove_if, но не для всех классов контейнеров. remove_if также существует как алгоритм, который можно использовать с итераторами, которые вы можете получить от begin() и end().