Effective_STL 学习笔记(四十三) 尽量用算法调用代替手写循环
每一个算法接受至少一对用来指示将被操作对象区间的迭代器,比如,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 学习笔记(四十三) 尽量用算法调用代替手写循环相关推荐
- 全是精髓!也许是最完美的“Nginx学习笔记”了,阿里云高工“365”天手写!
前言 "Nginx",一个高性能的HTTP和反向代理web服务器,Nginx因为内存少.并发能力强的特性,深受虚拟机主机提供商的欢迎,可以支持高达50000个并发连接数的响应.Ng ...
- OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( )
OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( ) 1.霍夫线变换HoughLines() OpenCV支持三种不同的霍夫线变 ...
- Python学习笔记(十三):异常处理机制
Python学习笔记(十三):异常处理机制 关于Python的异常处理机制 Python学习笔记(十三):异常处理机制 一.异常处理机制 常见异常类型 二.异常处理 try...except 异常类的 ...
- 【http学习笔记四】安全篇
[http学习笔记四]安全篇 文章目录 [http学习笔记四]安全篇 一.HTTPS 与 SSL/TLS ① 什么是安全? 机密性 完整性 身份认证 不可否认 ② 什么是HTTPS? ③ SSL/TL ...
- 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码
吴恩达<机器学习>学习笔记四--单变量线性回归(梯度下降法)代码 一.问题介绍 二.解决过程及代码讲解 三.函数解释 1. pandas.read_csv()函数 2. DataFrame ...
- 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...
机器学习实战(Machine Learning in Action)学习笔记----06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习 作者:米仓山下 时 ...
- python数据挖掘学习笔记】十三.WordCloud词云配置过程及词频分析
#2018-03-28 09:59:40 March Wednesday the 13 week, the 087 day SZ SSMR 11,12因为涉及到数据库被我暂时放弃了 python数据挖 ...
- Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍
开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...
- 【C++ Primer 学习笔记】: 容器和算法之【泛型算法】
本系列博客主要是在学习 C++ Primer 时的一些总结和笔记. [C++ Primer 学习笔记]: 容器和算法之[泛型算法] 本文地址:http://blog.csdn.net/shanglia ...
最新文章
- Java学习路线图,如何学习Java事半功倍?
- go移植linux内核书名叫啥,Go语言移植Linux内核数据结构hlist
- c++ 弧形面如何逆时针排序_这8种常见的Java排序算法,学算法必看!
- php 屏蔽ip段,php禁止ip段的方法
- Lintcode--5(37)--反转一个三位数
- 小程序 封装table组件
- mysql 通过echo的方式写入数据库 中文乱码解决方案
- bootstrap-multiselect.js如何动态更新select里的数据
- 三星如何抄袭苹果 产品对比一目了然
- 【原创】ABAP根据文件路径获取文件所在目录
- 企业如果结合职工筑牢安全生产压舱石_山能枣矿集团柴里煤矿机电运输科扎实推进女职工“素质提升+岗位建功”竞赛活动...
- 【Emb】词向量与ELMo模型
- restorator打开后win10不能打开任何程序,右键桌面没有打开选项
- 佛系程序员的月薪五万指南 -- 作者|李运华
- 没学历,如何成为一名优秀的Java程序员
- 基于C/C++的实现p2p功能
- 网易2017校招合唱团
- 【FinE】资产组合理论(2) 均值方差模型
- 小程序云开发(一):新建云开发模板
- 李敖之子李戡:《严正声明─我对韩…
热门文章
- Exchange2010配置-设置OWA身份验证及重定向
- JS调用PageOffice接口,删除Word表格中光标所在行
- 使用C++与SFML编写一个简单的撞球游戏Part1——新建工程以及设置
- 预发布环境,Tag发布机制和可重复的部署过程
- 技术文章精美配图模板网站推荐-创客贴
- Redis-序列化和存储模式
- redis的rpm包下载安装
- Connection closed by foreign host. 误改BUG
- HTML5 Canvas API 变换(translate函数)
- 用Apache Hadoop和Apache Solr处理和索引医学图像