Мы можем удалить один элемент / запись из контейнера с помощью популярной идиомы erase – remove а>. Однако многие из нас столкнулись бы с некоторыми проблемами при применении этой идиомы:
можно легко попасть в ловушку опечаток, например
c.erase(std::remove_if(c.begin(), c.end(), pred)); // , c.end() //---> missing here
or
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
, поскольку не выбирает собственный элемент _ 4_ в качестве идиомы. - В-третьих, использование
std::remove_if
не работает для ассоциативных контейнеров.
Есть ли у нас что-нибудь обобщенное и менее подверженное опечаткам, чем std::erase-std::remove_if
или что-то вроде std::erase_if
в рамках c ++ 17, или такая утилита будет в c ++ 20?