为什么标准没有提供擦除删除惯用语的便利帮助程序?

2024-04-13

从 STL 中的集合中删除项目需要一种经常使用的技术,该技术已成为一种习惯用法:擦除-删除-惯用语 https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom

这个习语最常见的用法之一是删除类型的项目T from a vector<T>

std::vector<Widget> widget_collection;
Widget widget;

widget_collection.erase(
    std::remove(widget_collection.begin(), widget_collection.end(), widget), 
    widget_collection.end());

这显然非常冗长,并且违反了干燥原则 https://en.wikipedia.org/wiki/Don%27t_repeat_yourself- 那里需要 4 次有问题的向量。

所以我的问题是为什么该标准不提供方便的助手?

就像是

widget_collection.erase_remove(widget);

or

std::erase_remove(widget_collection, widget);

这显然可以扩展到

widget_collection.erase_remove_if(widget, pred);

etc...


该问题已由提案涵盖N4009:统一容器擦除 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4009.htm其中说:

这是添加erase_if(container, pred)的建议,使其 更容易正确有效地消除不需要的元素。

[...]

从容器中消除不需要的元素是非常困难的, 给定一个区分“坏”元素和“好”元素的谓词。

STL 的主要优势之一是它的所有容器都具有相似的 接口 - 它们有许多共同的功能并且遵循相同的原则 惯例。当容器接口不同时,之间的根本区别 他们的数据结构负责。即使这些差异也常常是 由于 STL 的容器迭代器算法设计,它被忽略了。

并且还指出:

正确的反应 是使用擦除-删除惯用语,这是不明显的,必须教授 而不是被发现(出于某种原因,它被称为“习语”)。

最新版本N4273:统一容器擦除(修订版 2) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4273看起来好像是adopted http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/sd-1.htm。它是一部分Library Fundamentals V2 的扩展 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4336.html。另请参阅 cppreference 部分C++ 标准库扩展,版本 2 http://en.cppreference.com/w/cpp/experimental/lib_extensions_2.

头部修订(版本6.0.0)Wandbox 上可用的 gcc 具有此标头的实现(现场观看 http://melpon.org/wandbox/permlink/1fo2VHdnr1MzD5t1):

#include <experimental/vector>
#include <iostream>

int main()
{
    std::vector<int> v1 = {1,2,3,4,5,6} ;

    std::experimental::erase_if( v1, [] (const int &x ) { return x < 4; } ) ;

    for( const auto & v : v1 )
    {
        std::cout << v << ", " ;
    }
    std::cout << "\n" ;
}

这段代码也适用于网络编译器 http://webcompiler.cloudapp.net/这似乎证实了 T.C. 的建议,即这也随 MSVC 2015 一起提供。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么标准没有提供擦除删除惯用语的便利帮助程序? 的相关文章

随机推荐

  • VBScript 运行时错误“800a000d”

    在我们的业务中 我们使用安全向导来控制和管理活动目录安全性 并对所做的更改进行审计跟踪 这是一个带有 ASP 前端的 SQL 数据库 它还可以与我们的 Active Directory 进行通信 编写该向导的人已经在我们的网站上为公司的另一
  • 接受两种类型之一的通用类

    我想创建一个这种形式的通用类 class MyGenericClass
  • 在 ASP.NET Core MVC 中选择 ENUM 标记帮助器

    我需要一些使用标签帮助器的枚举下拉列表的帮助 我发现了很多将模型绑定到 Selectlist 的示例 有些使用 ENUM 但所有这些示例都与 CREATE 操作有关 而我面临着 EDIT 操作的问题 MY MODEL public clas
  • 在 Firefox 中更好地查看 XML

    当您在 Firefox 中查看简单的 XML 文档时 它会进入标准 XML 显示模式 您可以在其中折叠子树等 但它的功能非常有限 没有什么比 全部展开 和 全部折叠 按钮更方便的了 页面顶部有一条烦人的 此 XML 文件似乎没有任何与之关联
  • 如何使 cassandra 中的值独一无二

    我想在 cassandra 中进行唯一约束 因为我希望我的专栏中的所有值在我的专栏系列中都是唯一的 前任 名字 拉胡尔 电话123 地址 abc 现在我希望我这一行没有等于 rahul 123 和 abc 的值在 datastax 上搜索时
  • 如何使用地理编码器计算两点之间的距离(以公里为单位)

    我正在尝试找出一种使用地理编码器显示地图上两点之间的计算距离的方法 我的表中有 start address 和 destination address 在我看来是我要求的 我的模型如下所示 class Ride lt ActiveRecor
  • 为什么 java.util.Properties 实现 Map 而不是 Map

    The java util Properties类旨在表示一个映射 其中键和值都是字符串 这是因为Properties对象用于读取 properties文件 它们是文本文件 那么 为什么在Java 5中他们要改造这个类来实现Map
  • Istio 目标规则子集不起作用

    我的 istio 目标规则不起作用 在 kiali 中出现以下错误 VirtualService and destination rule for echo service 我的召唤echo svc 8080 and echo svc 80
  • 如何使用 querySelector on 按名称选择输入元素?

    我最近在该网站上收到了有关使用的帮助querySelector在表单输入上 例如select但当我采取
  • 在 Android Studio 中注释/取消注释所选文本的键盘快捷键

    如何使用控制组合键注释掉 IDE 中选定的几行文本 I thought that Ctrl Alt C was the correct sequence but that s not working To comment uncomment
  • 如何从 javax.lang.model.VariableElement 获取参数类型

    我正在尝试使用 Java 6 元模型 API 查找方法的参数类型 如果类型是枚举 我还想知道它的所有类型的枚举常量名称 这是我到目前为止所得到的 for Element member members if member getKind El
  • 将 NSArray 写回 plist

    我有一个具有以下格式的 plist 我是这样读的 NSString errorDesc nil NSPropertyListFormat format NSString path NSBundle mainBundle pathForRes
  • 确定组件的所有者何时加载

    我创建了一个包含自定义组件的 WinForms 应用程序 该组件需要在启动时触发其事件之一 但是在调用组件的构造函数时 所有事件处理程序仍然为空 我需要的是一个事件 告诉我拥有该组件的窗口已加载并且所有事件处理程序已设置 然而 组件似乎没有
  • 从 GitHub 拉取请求获取评论列表

    根据http developer github com v3 pulls comments list comments on a pull request http developer github com v3 pulls comment
  • 泛型错误:预期类型参数,找到结构

    我开始了一个新项目 我希望尽可能模块化 我的意思是我希望将来能够用其他部件替换某些部件 这似乎是一个完美的用途traits 目前我有这个代码 mod parser mod renderer mod renderers use parser
  • 我的 Django URL 没有显示破折号

    我正在尝试找出一个与domain com about us 和domain com home 匹配的网址 我有一个网址正则表达式 P
  • JavaScript 无法在脚本标签中工作? [复制]

    这个问题在这里已经有答案了 我需要知道为什么要这样做 因为我在网站的脚本标签中使用了 javascript 但它不起作用 为什么我的javascript在脚本标签中不起作用 切换不会切换 http jsfiddle net J7L4k 2
  • 如何获取 asp.net c# 的发布数据[重复]

    这个问题在这里已经有答案了
  • WiX 在构建服务器上失败

    我有一个使用 WiX 的项目 它在我的本地计算机上运行良好 但是当我发布到构建服务器时 构建会因以下内容而崩溃 来自 MSBuild 日志 Using HeatDirectory task from assembly C Program F
  • 为什么标准没有提供擦除删除惯用语的便利帮助程序?

    从 STL 中的集合中删除项目需要一种经常使用的技术 该技术已成为一种习惯用法 擦除 删除 惯用语 https en wikipedia org wiki Erase E2 80 93remove idiom 这个习语最常见的用法之一是删除