Не входит в область действия c ++ 17 , но c ++ 20 и далее!
Да .Предложение о последовательном удалении контейнеров было упомянуто в n4009 документе и окончательно принято в C ++ 20 стандарте как std::erase_if
, что нефункция -член для каждого контейнера .
Это обеспечивает единообразную семантику стирания контейнеров для std::basic_string
и всех стандартных контейнеров , кроме std::array
(поскольку он имеет фиксированный размер).
Это означаетчто стандартный код
container.erase(
std::remove_if(
container.begin(), container.end(),
[](const auto& element) ->bool { return /* condition */; }),
vec.end());
просто расплавится до обобщенной формы из
std::erase_if(container, [](const auto& element) ->bool { return /* condition */; });
Во-вторых, этот унифицированный синтаксис выбирает правильную семантику длякаждый контейнер .Это означает
Для контейнеров последовательности, таких как std::vector
, std::deque
и для std::std::basic_string
, этобудет эквивалентно
container.erase(
std::remove_if(container.begin(), container.end(), unaryPredicate)
, container.end()
);
Для контейнеров последовательности std::forward_list
и std::list
будет эквивалентно
container.remove_if(unaryPredicate);
Для заказанных ассоциативных контейнеров (т.е. std::set
, std::map
, std::multiset
и std::multimap
) и неупорядоченные ассоциативные контейнеры (т. Е. std::unordered_set
, std::unordered_map
, std::unordered_multiset
и std::unordered_multimap
), std::erase_if
эквивалентно
for (auto i = container.begin(), last = container.end(); i != last; )
{
if (unaryPredicate(*i))
{
i = container.erase(i);
}
else
{
++i;
}
}
В дополнение к этому стандарт также добавил std::erase
для последовательных контейнеров формы
std::erase(container, value_to_be_removed);