热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么没有std::erase?

如何解决《为什么没有std::erase?》经验,为你挑选了3个好方法。

在阅读STL时,我意识到没有std::erase提供.我不确定为什么它不存在.一个有效的用例如下

std::vector odd { 1, 3, 5, 3, 9, 11, 5, 17 };
std::sort(odd.begin(), odd.end());
std::erase(std::unique(odd.begin(), odd.end()), odd.end());

它嵌入在每个容器中.如果性能是原因,那么如果对象是连续的,则可以一次删除它们.但我想这可以通过帮助模板专业化来实现.



1> StoryTeller ..:

它会如何工作?它只接受一对迭代器.迭代器不具备继续履行其容器的引用(向量的迭代器可以是单纯的别名指针).

那么算法如何修改容器本身呢?它需要访问权限.

它必须是成员函数.



2> emsr..:

2014年底,在图书馆基础2 TS中添加了统一的容器擦除.这是最近投票的C++ - 2a的标准,但即使是github的草案也没有显示.我知道gcc,clang和Visual Studio支持实验.

因此,代替您通常的容器包括以下版本之一:










这些是来自最近的一篇论文的签名:

  // 
  template 
    void erase_if(basic_string& c, Predicate pred);
  template 
    void erase(basic_string& c, const U& value);

  // 
  template 
    void erase_if(deque& c, Predicate pred);
  template 
    void erase(deque& c, const U& value);

  // 
  template 
    void erase_if(vector& c, Predicate pred);
  template 
    void erase(vector& c, const U& value);

  // 
  template 
    void erase_if(forward_list& c, Predicate pred);
  template 
    void erase(forward_list& c, const U& value);

  // 
  template 
    void erase_if(list& c, Predicate pred);
  template 
    void erase(list& c, const U& value);

  // 
  template 
    void erase_if(map& c, Predicate pred);
  template 
    void erase_if(multimap& c, Predicate pred);

  // 
  template 
    void erase_if(set& c, Predicate pred);
  template 
    void erase_if(multiset& c, Predicate pred);

  // 
  template 
    void erase_if(unordered_map& c, Predicate pred);
  template 
    void erase_if(unordered_multimap& c, Predicate pred);

  // 
  template 
    void erase_if(unordered_set& c, Predicate pred);
  template 
    void erase_if(unordered_multiset& c, Predicate pred);


它已添加到C ++ 20中,并且最近在gcc-9,clang-7,Visual studion中实现。

3> lubgr..:

序列和算法之间的粘合剂是迭代器(感谢@Pete Becker在这里指出了正确的术语).它们归结为可应用于多个序列(容器)类型的强大算法所需的最小功能.一个例子是这样一个片段:

std::vector vec{1, 2, 3, 4};
std::list lst;

std::copy(vec.cbegin(), vec.cend(), std::back_inserter(lst));
std::copy(lst.cbegin(), lst.cend(), std::ostream_iterator(std::cout, " "));

在这里,std::copy可以独立于它所操作的特定序列类型来实现,因为它与迭代器一起工作,这些迭代器要做两件事:遍历序列并提供对其元素的访问.

但是,当从容器中删除元素时,这具有限制.

在利用(std- )算法时这样做的必要性足以引起擦除删除习惯用法是一个众所周知的模式或范围库,它利用整个容器传递给算法:

#include 

std::vector vec{1, 2, 3, 4};

boost::remove_erase(vec, 3);

最后一个函数调用实际上可以3从容器中删除带有值的元素,因为在该函数调用中没有隐藏任何信息.相比之下,*begin/ *end(成员)函数族完全相同:将信息隐藏在抽象之后.


抽象比这更抽象.迭代器是**序列**和算法之间的粘合剂.容器是管理序列的一种方式,但它们不是唯一的方法.例如,您可以创建一对遍历输入流的迭代器; 很少有人会将输入流称为容器.+1无论如何.
推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 标题: ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
author-avatar
ude816
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有