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

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(使用前将#替换为@)

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

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 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 这个习语最常见的用法之一是删除