Мы можем стереть один элемент/запись из контейнера с помощью популярной идиомы удаления-удаления. Однако многие из нас столкнулись бы с некоторыми проблемами при применении этой идиомы:
-
можно легко попасть в ловушку опечаток, таких как
c.erase(std::remove_if(c.begin(), c.end(), pred)); // , c.end() //---> missing here
или же
c.erase((std::remove_if(c.begin(), c.end(), pred), c.end())) // ^^ ^^ // extra () makes it pass only c.end() to the c.erase
- Он даже следует неверной семантике для контейнеров, таких как
std::list
, не выбирая собственный членstd::list::remove_if()
для этой идиомы. - В-третьих, использование
std::remove_if
не работает для ассоциативных контейнеров.
Есть ли у нас что-то обобщенное и менее подверженное опечаткам, чем std::erase-std::remove_if
или что-то вроде std::erase_if
в рамках c++17, или такая утилита будет в c++20?