Задача удаления элементов с определенным свойством из std::vector
или другого контейнера поддается реализации функционального стиля: зачем беспокоиться о циклах, освобождении памяти и перемещении данных вокруг?
Однако стандартным способом сделать это в С++ представляется следующая идиома:
std::vector<int> ints;
...
ints.erase(
std::remove_if(ints.begin(),
ints.end(),
[](int x){return x < 0;}),
ints.end());
В этом примере удаляются все элементы, меньшие нуля, из целочисленного вектора.
Я нахожу его не только уродливым, но и простым в использовании. Понятно, что std::remove_if
не может изменить размер вектора (как подсказывает его имя), потому что он пропускает только итераторы. Но многие разработчики, включая меня, не понимают этого в начале.
Итак, есть ли более безопасный и, надеюсь, более элегантный способ достичь этого? Если нет, то почему?