每一个算法接受至少一对用来指示将被操作对象区间的迭代器,比如,min_element 可以找出此区间中的最小的值,而 accumulate 则对区间内的元素作某种形式的整体求和运算,partition 将区间内的元素分割为满足和不满足某某判决条件的两个部分。算法执行时,他们进行检查指示给它的区间中的每一个元素,并且按照所期望的方式进行: 从区间中的起点循环到结束点。有一些算法,比如 find 和 find_if,可能在遍历完成前就返回了,但是即使是这些算法,内部都包含一个循环。

算法内部是一个循环,STL 的广泛涉及面意味着,很多要用循环实现的任务,可以改用算法实现。

1   class Widget
2   {
3   public:
4     void redraw() const;
5     . . .
6   }

使用循环

1   list<Widget> lw;
2   . . .
3   for(list<Widget>::iterator i = lw.begin(); i != lw.end(); i++)
4     i->redraw();

使用 for_each 算法

1   for_each( lw.begin(), lw.end(), mem_fun_ref(&Widget::redraw) );

有三个理由:

  效率: 算法通常比程序员产生的循环更高效

  正确性: 写循环时比调用算法更容易产生错误

  可维护性: 算法通常使代码比相应的显示循环更干净、更直观

效率:算法往往比循环减少了大量的函数调用次数(上例中,多次调用 lw.begin()),STL实现者知道 begin 和 end 用的很频繁,多以尽可能把他们实现得最高效,几乎肯定的是 inline 它们。实现者可以利用知道的容器具体实现优势,用库的使用者无法采用方式来优化遍历。所有STL算法使用的计算机科学都比一般的 C++ 程序员能拿的出的算法更复杂。几乎不可能被打败的 sort 及同组算法(比如,stable_sort(), nth_element()等);适用于有序区间的搜索算法(比如,binary_search, lower-bound等);就算很平凡的任务,比如从连续内存容器中除去一些对象,使用 erase-remove 惯用法都比绝大多数程序员写得更高效.

正确性:写循环时,比麻烦的事在于确保所有使用的迭代器(a)有效,并且(b)指向所期望的地方,假设有一个数组,想获得每一个元素,把它加上41,然后将结果插入一个 deque 的前端

1   size_t fillArray( double* pArray, size_t arraySize );//函数向数组写入数据,返回写入double个数
2   double data[maxNumDoubles];  
3   deque<double> d;
4   . . .
5   size_t numDoubles = fillArray( data, maxNumDoubles );
6   for(size_t i = 0; i < numDoubles; i++)
7     d.insert( d.begin(), data[i] + 41 );  // 每个数据在 d 的前端插入 data[i] + 41        
8                               // 这段代码有一个bug!

这可以执行,但是插入元素与在 data 中对应的元素是反序的

不想反序可能想这样修改:

1   deque<double>::iterator insertlocation = d.begin();  // 记下d的起始迭代器
2   for( size_t; i < numDoubles; i++ )
3     d.insert( insertLocation++, data[i] + 41 );// 插入data[i]+41,然后insertLocation递增
4                                // 这段代码也有 bug

这样使得每次调用 deque::insert 后,都导致所有指向 deque 内部的迭代器失效

改为:

1     deque<double>::iterator insertlocation = d.begin();
2     for( size_t i = 0; i < numDoubles; i++ )
3     {
4         insertLocation = d.insert( insertLocation, data[i] + 41 );
5       ++insertLocation;
6     }

调用算法 transform:

1   transform(data, data+numDoubles, inserter(d, d.begin()), bind2nd(plus<double>(), 41));

把迭代器扔给算法,让他们考虑操纵迭代器时的各种诡异

  

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

Effective_STL 学习笔记(四十三) 尽量用算法调用代替手写循环相关推荐

  1. 全是精髓!也许是最完美的“Nginx学习笔记”了,阿里云高工“365”天手写!

    前言 "Nginx",一个高性能的HTTP和反向代理web服务器,Nginx因为内存少.并发能力强的特性,深受虚拟机主机提供商的欢迎,可以支持高达50000个并发连接数的响应.Ng ...

  2. OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( )

    OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( ) 1.霍夫线变换HoughLines() OpenCV支持三种不同的霍夫线变 ...

  3. Python学习笔记(十三):异常处理机制

    Python学习笔记(十三):异常处理机制 关于Python的异常处理机制 Python学习笔记(十三):异常处理机制 一.异常处理机制 常见异常类型 二.异常处理 try...except 异常类的 ...

  4. 【http学习笔记四】安全篇

    [http学习笔记四]安全篇 文章目录 [http学习笔记四]安全篇 一.HTTPS 与 SSL/TLS ① 什么是安全? 机密性 完整性 身份认证 不可否认 ② 什么是HTTPS? ③ SSL/TL ...

  5. 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码

    吴恩达<机器学习>学习笔记四--单变量线性回归(梯度下降法)代码 一.问题介绍 二.解决过程及代码讲解 三.函数解释 1. pandas.read_csv()函数 2. DataFrame ...

  6. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...

    机器学习实战(Machine Learning in Action)学习笔记----06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习 作者:米仓山下 时 ...

  7. python数据挖掘学习笔记】十三.WordCloud词云配置过程及词频分析

    #2018-03-28 09:59:40 March Wednesday the 13 week, the 087 day SZ SSMR 11,12因为涉及到数据库被我暂时放弃了 python数据挖 ...

  8. Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍

    开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...

  9. 【C++ Primer 学习笔记】: 容器和算法之【泛型算法】

    本系列博客主要是在学习 C++ Primer 时的一些总结和笔记. [C++ Primer 学习笔记]: 容器和算法之[泛型算法] 本文地址:http://blog.csdn.net/shanglia ...

最新文章

  1. Java学习路线图,如何学习Java事半功倍?
  2. go移植linux内核书名叫啥,Go语言移植Linux内核数据结构hlist
  3. c++ 弧形面如何逆时针排序_这8种常见的Java排序算法,学算法必看!
  4. php 屏蔽ip段,php禁止ip段的方法
  5. Lintcode--5(37)--反转一个三位数
  6. 小程序 封装table组件
  7. mysql 通过echo的方式写入数据库 中文乱码解决方案
  8. bootstrap-multiselect.js如何动态更新select里的数据
  9. 三星如何抄袭苹果 产品对比一目了然
  10. 【原创】ABAP根据文件路径获取文件所在目录
  11. 企业如果结合职工筑牢安全生产压舱石_山能枣矿集团柴里煤矿机电运输科扎实推进女职工“素质提升+岗位建功”竞赛活动...
  12. 【Emb】词向量与ELMo模型
  13. restorator打开后win10不能打开任何程序,右键桌面没有打开选项
  14. 佛系程序员的月薪五万指南 -- 作者|李运华
  15. 没学历,如何成为一名优秀的Java程序员
  16. 基于C/C++的实现p2p功能
  17. 网易2017校招合唱团
  18. 【FinE】资产组合理论(2) 均值方差模型
  19. 小程序云开发(一):新建云开发模板
  20. 李敖之子李戡:《严正声明─我对韩…

热门文章

  1. Exchange2010配置-设置OWA身份验证及重定向
  2. JS调用PageOffice接口,删除Word表格中光标所在行
  3. 使用C++与SFML编写一个简单的撞球游戏Part1——新建工程以及设置
  4. 预发布环境,Tag发布机制和可重复的部署过程
  5. 技术文章精美配图模板网站推荐-创客贴
  6. Redis-序列化和存储模式
  7. redis的rpm包下载安装
  8. Connection closed by foreign host. 误改BUG
  9. HTML5 Canvas API 变换(translate函数)
  10. 用Apache Hadoop和Apache Solr处理和索引医学图像