C++ 标准库是否提供更紧凑和通用的擦除 - 删除惯用语版本?

Does C++ standard library provide more compact and generalized version of the erase–remove idiom?

我们可以通过流行的erase–remove idiom 从容器中删除一个元素/条目。 然而,我们中的许多人在应用这个成语时会遇到一些问题:


, or will there be such a utility in 的范围内,我们是否有比 std::erase-std::remove_if 或类似 std::erase_if 更普遍且更不易打错字的东西

不在, but 以后的范围内!

n4009 paper and finally adopted in C++20 standard as std::erase_if中提到了一致性容器擦除的提议,即每个容器的non-member功能。

这确保了 std::basic_stringall standard containers 的统一容器擦除语义,除了 std::array(因为它具有 fixed-size)。

这意味着样板代码

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::erase
std::erase(container, value_to_be_removed);