有些STL 容器提供了一些与算法同名的成员函数。大多数情况下,应该使用这些成员函数,而不是相应的STL算法。 有两个理由:

  • 成员函数往往速度快。
  • 成员函数通常与容器结合地更紧密,这是算法所不能比的。

set容器的find成员函数以对数时间运行,而find算法以线性时间运行。

效率并不是find成员函数和find算法之间的唯一差别。STL算法以相同性而判断两个对象是否具有相同的值,而关联容器使用等价性来进行它们的"相同性"测试。因此,在使用关联容器的时候,应该优先考虑成员函数形式的find、count、lower_bound等,而不是相应的STL算法,这些成员函数的行为与关联容器的其他成员函数能够保存更好的一致性。由于相等性和等价性之间的差别,STL算法不可能提供这样的一致性。

对于标准的关联容器,选择成员函数而不选择对应的同名算法,这可以带来几方面的好处。

  • 可以获得对数时间的性能,而不是线性时间的性能。
  • 可以使用等价性来判断的那个两个值是否"相同",而等价性是关联容器的一个本质定义。
  • 在使用map和multimap的时候,将很自然地只考虑元素的键部分,而不是完整的键值对。

对于list,性能几乎成为了全部考虑元素。

remove、remove_if、unique、sort、merge以及reverse这些算法无一例外地需要拷贝list容器的对象,而这些版本的成员函数则无需任何对象拷贝,它们只是简单地维护好那些将list节点连接起来的指针。这些算法的时间复杂度并没有改变,但多数情况下维护指针的开销比拷贝对象要低得多,所以list成员函数应该会提供更好地性能。

list成员函数的行为不同于其同名的算法。如果真的要从容器中删除对象的话,在调用remove、remove_if或者unique算法之后,必须接着调用erase。而list的remove、remove_if、unique成员函数则实实在在地删除了元素,所以无需再调用erase。

sort算法与list的sort函数之间一个很重要的区别是,前者根本不能被应用于list容器上,list的迭代器只是双向迭代器,而sort算法要求随机访问迭代器。在merge算法和list的merge成员函数之间也存在这种区别。merge算法是不允许修改其源区间的,而list的merge成员函数总是在修改它所操作的链表。

当需要在STL算法与容器的同名成员函数之间做出选择的时候,应该优先选择成员函数。成员函数的性能更为优越,而却它们更能够与容器的一贯行为保持一致。

17.容器的成员函数优先于同名的算法相关推荐

  1. c++ hashset的用法_c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  2. 2.区间成员函数优先于与之对应的单元素成员函数

    案例1:v1.v2两个vector, 将v2后半部分内容赋给v1 区间成员函数版本: std::vector<int> v1; ... std::vector<int> v2; ...

  3. c++关联容器的成员函数find的一个例子

    先来一个灰色难懂的部分镇楼. #include <string> #include <iostream> #include <list> #include < ...

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

    有些容器拥有和 STL 算法同名的成员函数. 关联容器提供了 count.find.lower_bound.upper_bound 和 euqal_range list 提供了 remove.remo ...

  5. C++《STL和泛型编程》容器不带/带有成员函数总结

    容器不带成员函数count(): array  vector  list  forward_list  deque 容器带有成员函数count(): set/multiset  map/multima ...

  6. C++ 常用容器成员函数用法总结

    C++ 常用容器成员函数用法总结 C++ 常用容器成员函数用法总结 简介 迭代器 简介 array: 静态数组 简介 构造函数 访问 / 赋值 迭代器 下标 / at 批量赋值 swap (交换函数) ...

  7. STL的remove函数和list的remove成员函数

    今天看书刚刚看的,就记录下来吧.这可能是老生常谈了,权且作为一个警醒的例子吧. 大家都知道STL有两个非常重要的组成部分,容器和算法. 算法就是一个个的函数,通过迭代器和容器关联在一起,完成一些工作. ...

  8. C++常数据成员,常成员函数及常对象的使用

    一.常数据成员不可修改,声明方式:const [类型][标识符] 二.常成员函数可以和同名的非常成员函数发生重载,且声明和定义时都要带上const,调用时不需要,声明方式:[类型][函数名](参数列表 ...

  9. 成员函数对象类的const和非const成员函数的重载

    首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 1. 类的const成员函数与非const成员函数的载重 #include <iostream> #include <st ...

最新文章

  1. 手把手重现Science的主图Maptree
  2. DataReader 连接数据库完整过程和代码(Sql Server)
  3. python调用chrome插件_Python使用Chrome插件实现爬虫过程图解
  4. 计算机怎么更改用户头像像,Win10系统电脑账户头像怎么改成系统默认状态?
  5. SQLServer2008内存飙升 解决
  6. JSP 实现登录注册功能
  7. 手把手教你使用EndNote X8 详细笔记
  8. office2003无法正常安装卸载问题解决
  9. Win10如何设置护眼模式?
  10. Java项目服务器cpu占用100%解决办法
  11. 云原生 Kuma 简单部署与使用
  12. c语言流水调度作业,最优流水作业调度问题:流水作业调度问题
  13. (PTA)数据结构(作业)11、树和图
  14. 2019年TI杯 简易电路特性测试仪 制作过程(9)——实际测试效果 20/05/24
  15. 视频号扩展链接一键转换
  16. 【转】YV12 and NV12
  17. Nginx 正确使用姿势
  18. pomelo分布式聊天服务器详解
  19. 经验分享:写给入职2~3年同学的一封信
  20. 单招计算机面试技巧和注意事项,单招面试技巧和注意事项有哪些

热门文章

  1. JSON Web Tokens(JWT)
  2. 套接口学习(一)实现
  3. 蓝桥杯历届试题 国王的烦恼(并查集逆序加边+坑)
  4. 七、数据库技术基础(一)
  5. 蓝桥杯——寻找数组中的最大值
  6. 青春可长可短, 就看自己如何度过(亦或者如白驹过隙, 稍纵即逝 正所谓且行且珍惜)...
  7. php学习_数组 2013.01.04
  8. [网络安全提高班] 一〇一.网络攻防溯源普及和医疗数据安全总结
  9. 【数据结构与算法】之链表的操作和使用
  10. Django MPTT —— 安装