有些容器拥有和 STL 算法同名的成员函数。

关联容器提供了 count、find、lower_bound、upper_bound 和 euqal_range

list 提供了 remove、remove_if、unique、merge 和 reverse

大多数时候应该用成员函数代替手写算法,这样做的两个理由:

  比起算法,它们与容器结合的更好(尤其是关联容器)

  同名的算法很成员函数通常不是一样的

假设 set<int> 容纳一百万个元素,想找到元素 727 的第一次出现的位置

1   set<int> s;
2   . . .
3   set<int>::iterator i = s.find(727);  // 使用成员函数
4   if( i != s.end() ) . . .
5   set<int>::iterator i = find( s.begin(), s.end(), 727 ); // 使用 find 算法
6   if( i != s.end()) . . .

使用成员函数花费对数时间(set实现为红黑树),使用算法将花费线性时间

STL 算法判断两个对象是否相同的方法检查的是它们是否相等,而关联容器是用等价来测试它们的 “同一性”

对于标准关联容器,选择成员函数而不是同名算法几个好处,首先,得到对数时间而不是线行时间的性能。其次,判断连个元素 “相同”使用的是等价,这是关联容器的默认定义。第三,当操纵 map 和 multimap 时,可以自动地只处理 key 值而不是(key, value)对。

list 的成员函数。每个被 list 作了特化的算法(remove、remove_if、unique、sort、merge 和 reverse)都要拷贝对象,而 list 的特别版本什么都没有拷贝;它们只是简单地操纵连接 list 的节点的指针。算法和成员函数的算法复杂度是相同的。

另外,list 的成员函数的行为和它们的同名算法的行为经常是不相同。如果真想从容器中清除对象,调用 remove、remove_if 和 unique 算法后,必须接着调用 erase 函数;但是,list 的 remove、remove_if 和 unique 成员函数真的去掉了元素,后面不再需要接着调用 erase

在 sort 算法和 list 的成员函数间的一个重要的区别是前者不能用于 list。作为单纯的双向迭代器, list 的迭代器不能传给 sort 算法。merge 算法和 list 的merge 成员函数之间也同样存在巨大差异

转载于:https://www.cnblogs.com/kidycharon/p/10052504.html

Effective_STL 学习笔记(四十四) 尽量使用成员函数代替同名的算法相关推荐

  1. Windows保护模式学习笔记(十四)—— 阶段测试

    Windows保护模式学习笔记(十四)-- 阶段测试 题目一 解题步骤 题目二 解题步骤 题目一 描述:给定一个线性地址,和长度,读取内容 int ReadMemory(OUT BYTE* buffe ...

  2. OpenCV学习笔记(十四):重映射:remap( )

    OpenCV学习笔记(十四):重映射:remap( ) 图像的坐标映射是通过原图像与目标图像之间建立一种映射关系,这种映射关系有两种,一种是计算原图像任意像素在映射后图像的坐标位置,另一种是计算变换后 ...

  3. QT学习笔记(十四):QLayout的属性介绍

    QT学习笔记(十四):QLayout的属性介绍 主要包括QBoxLayout.和QGridLayout以及QFormLayout等的参数类似. 我主要说明一下QGridLayout在QtDesigne ...

  4. MATLAB学习笔记(十四)

    MATLAB学习笔记(十四) 一.线性方程组求解 1.1 直接法 1.1.1 利用左除运算符 1.1.2 利用矩阵分解 1.2 迭代法 1.2.1 雅可比(Jacobi)迭代法 1.2.2 高斯-赛德 ...

  5. python数据挖掘学习笔记】十四.Scipy调用curve_fit实现曲线拟合

    #2018-03-28 10:02:08 March Wednesday the 13 week, the 087 day SZ SSMR python数据挖掘学习笔记]十四.Scipy调用curve ...

  6. Spring Security技术栈学习笔记(十四)使用Spring Social集成QQ登录验证方式

    上一篇文章<Spring Security技术栈开发企业级认证与授权(十三)Spring Social集成第三方登录验证开发流程介绍>主要是介绍了OAuth2协议的基本内容以及Spring ...

  7. Cty的Linux学习笔记(十四)

    Linux学习笔记--第十四篇 环境变量配置文件: /etc/profile:预设了几个重要的变量,例如PATH,USER,LOGNAME,MAIL,INPUTRC,HOSTNAME,HISTSIZE ...

  8. 深度学习笔记(十四)—— 超参数优化[Hyperparameter Optimization]

      这是深度学习笔记第十四篇,完整的笔记目录可以点击这里查看.      训练神经网络会涉及到许多超参数设置.神经网络中最常见的超参数包括: the initial learning rate lea ...

  9. Slicer学习笔记(十四)vtkMRMLVolumeNode 与 vtkImageData

    Slicer学习笔记(十四)vtkMRMLVolumeNode 与 vtkImageData 1.Adding in MRML to Slicer 2.MRML Scene 3.MRML Nodes ...

最新文章

  1. 【深度学习的数学】交叉熵公式如何推导?
  2. 制作Python的安装模块
  3. 电工结业试卷_电工电子考试试(含答案).doc
  4. java Jsoup不能获取完整响应内容
  5. 事务传播特性和隔离级别
  6. sw二次开发 python_基于C#的SolidWorks二次开发.doc
  7. 数字通信同步技术的matlab与fpga实现_数字通信电缆行业规模情况及趋势分析(附报告目录)...
  8. [论文阅读] Annotation-Efficient Cell Counting
  9. mysql for windows_mysql安装教程-windows版
  10. 使用RandomAccessFile读写数据
  11. 1978-2019年中国省市恩格尔系数表分享
  12. 徽州区数字城管平台智慧管理城市
  13. 少儿学python 仿真秀_“在家学”仿真:使用Python进行SCDM脚本建模攻略
  14. 密码生成器(C语言实现)
  15. 开启虚拟机电脑自动重启的解决
  16. 职场英语常用100句
  17. Kubernetes 学习路径
  18. 什么是网络爬虫?有哪些作用?如何构建?
  19. java未来三年的工作计划,未来三年的工作计划
  20. 雷军 50 岁身价破 1000 亿:决定人生胜负的,是这 5 条规律

热门文章

  1. 将excel转为python的字典_python读取excel表并把数据转存为字典
  2. 只能计算机论文,谈计算机及人工智能技术发展-人工智能论文-计算机论文.docx...
  3. navicat premium 链接postgresql 无法加载表_PostgreSQL 每周新闻 2020311
  4. python二维元素向量_详解python Numpy中求向量和矩阵的范数
  5. matlab求距离判别函数,求MATLAB的逐步判别程序 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  6. 华为2014校园招聘的机试题目
  7. Xlua文件在热更新中调用方法
  8. MYSQL和JAVA(课堂笔记)
  9. UVA 10269 Super Mario,最短路+动态规划
  10. Robert C. Martin关于UML、CASE的观点