C ++标准库是否提供更紧凑,更通用的“擦除删除”习惯用法版本?

JeJ*_*eJo 18 c++ c++-standard-library erase-remove-idiom c++17 c++20

我们可以通过流行的“ 删除-删除”惯用语从容器中删除一个元素/条目。但是,在应用此惯用语时,我们许多人会遇到一些问题:


的范围内,我们是否有python范围更广,更不易打错的std::erase-std::remove_if东西,或者是否会有这样的工具?std::erase_if

JeJ*_*eJo 27

不在的范围内,但在以后!

是的。在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());
Run Code Online (Sandbox Code Playgroud)

将简单地熔化至一广义形式

std::erase_if(container, [](const auto& element) ->bool { return /* condition */; });
Run Code Online (Sandbox Code Playgroud)

其次,这种统一的语法为每个容器选择适当的语义。这意味着


除此之外,该标准还添加std::erase以下形式的序列容器

std::erase(container, value_to_be_removed);
Run Code Online (Sandbox Code Playgroud)

  • 实际上,从文件上看,此实用程序是为每个标准容器指定的,并且不使用ADL。由于不允许在`std`中添加自定义重载,因此为您自己的容器自定义此重载的方法是在自己的名称空间中定义自己的单独的`erase_if`,然后可以转发至`std :: erase_if`或您的自己的容器”。 (2认同)
  • @TedLyngmo您可以编写该代码,然后它将找到您自己的`erase_if`(前提是ADL可以找到它,例如,如果它在与您的容器相同的名称空间中定义)。 (2认同)