有些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算法与容器的同名成员函数之间做出选择的时候,应该优先选择成员函数。成员函数的性能更为优越,而却它们更能够与容器的一贯行为保持一致。

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

  1. 17.容器的成员函数优先于同名的算法

    有些STL 容器提供了一些与算法同名的成员函数.大多数情况下,应该使用这些成员函数,而不是相应的STL算法. 有两个理由: 成员函数往往速度快. 成员函数通常与容器结合地更紧密,这是算法所不能比的. ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. (C++)A+B 输入输出练习V 输入的第一行是一个正数N,表示后面有N行。每一行的第一个数是M,表示本行后面还有M个数。
  2. LINUX 基础命令 一
  3. poj1905(二分查找)
  4. 文件标识符必须为双精度类型的整数值标量_【翻译】VTK官方文档 - vtk文件格式
  5. RDA5807 FM收音机模块
  6. hive 常见面试题
  7. GC通常的概念和算法
  8. Opencv多通道分离函数split()和多通道合并函数merge的使用
  9. selenium-webdriver自动化测试工具
  10. 那年我学过的SpringBoot笔记
  11. 查看本用户对文件的权限_Linux添加新用户,设置文件权限组
  12. Ubuntu16.04+NVIDIA显卡驱动安装步骤
  13. Cadence画PCB的傻瓜式教程
  14. Python基础语法回顾
  15. 软件工程导论---软件测试(集成测试、单元测试、验收测试、系统测试)
  16. 初中数学知识点总结_初中数学知识点汇总大全【超详细】,初中数学知识点归纳公式大全...
  17. 龙卷风java_程序设计-理解java继承-遁地龙卷风
  18. 农产品进出口成都代办公司注册流程
  19. ICG-PEG-OH 结构式,吲哚菁绿-聚乙二醇-羟基的相关说明
  20. 详解i++和++i,通俗易懂

热门文章

  1. 1 操作系统安全加固
  2. linux 下ftp的上传与下载
  3. Nginx限制访问次数和并发数
  4. Tizen已经够烂了 但份额还是超过了黑莓
  5. AVR之bootloader介绍
  6. Mac 苹果OS X小技巧:如何更改文件的默认打开方式
  7. 路由器故障排除的思路与理论
  8. 高度设置为100%无效的解决办法
  9. 14.性能之巅 洞悉系统、企业与云计算 --- 附录
  10. 4.性能之巅 洞悉系统、企业与云计算 --- 观测工具