Ответ 1
Я нахожу его не только уродливым, но и простым в использовании.
Не волнуйтесь, мы все это сделали с самого начала.
Понятно, что std:: remove_if не может изменить размер вектора (как подсказывает его имя), потому что он пропускает только итераторы. Но многие разработчики, включая меня, не понимают этого в начале.
То же самое. Это смущает всех. Это, вероятно, не должно было называться remove_if
все эти годы назад. Осторожно, а??
Итак, есть ли более безопасный и, надеюсь, более элегантный способ достичь этого?
Нет
Если нет, почему?
Поскольку это самый безопасный, самый элегантный способ, который сохраняет производительность при удалении элементов из контейнера, в котором удаление элемента делает недействительными итераторы.
предвидя:
Что я могу сделать?
Да, оберните эту идиому в функцию
template<class Container, class F>
auto erase_where(Container& c, F&& f)
{
return c.erase(std::remove_if(c.begin(),
c.end(),
std::forward<F>(f)),
c.end());
}
Затем вызов в мотивирующем примере выглядит следующим образом:
auto is_negative = [](int x){return x < 0;};
erase_where(ints, is_negative);
или
erase_where(ints, [](int x){return x < 0;});