STL学习笔记(七) 程序中使用STL
- 条款43:算法调用优先于手写循环
- class Widget {
- public:
- bool test();
- };
- vector<Widget> vec;
算法调用:
- for_each(vec.begin(), vec.end(), mem_fun_ref(&Widget::test));
手写循环:
- for(auto it = vec.begin(); it != vec.end(); ++it) it->test();
算法调用优于手写循环:效率更高; 正确性更容易; 可维护性更高
- 条款44:容器的成员函数优于同名算法
优先使用容器的成员函数: 速度更快;与容器结合更紧密
- set<int>::iterator it = s.find(); //T(n) = O(logn)
- set<int>::iterator it = find(s.begin(), s.end(), ); //T(n) = O(n)
使用关联容器时,优先考虑使用成员函数形式的 find、count,可以获得对数时间性能
list容器成员函数效率高于同名的STL算法函数(list容器的成员函数无需任何对象拷贝,仅仅维护指针)
注: list容器中 remove, remove_if, unique 不同于vector容器的先remove然后erase用法, list容器是实实在在删除元素,所以无需再erase
注: STL的sort算法不能用于list容器(因为sort需要随机访问迭代器), list::sort()是稳定算法
- 条款45:正确区分 count,find, binary_search, lower_bound, upper_bound, equal_range
在选择具体的查找策略时,首先需要考虑迭代器制定的区间是否有序,如果有序,可以使用 binary_search, lower_bound, upper_bound, equal_range
binary_search 返回值为 bool,仅仅表明查找值是否在有序序列中
equal_range 返回一对迭代器:
第一个迭代器等于 lower_bound 返回的迭代器,指向第一个与查找值相等的元素
第二个迭代器等于 upper_bound 返回的迭代器,指向最后一个与查找值相等元素的下一个元素
1.如果返回的两个迭代器相等,则表明没有找到欲查找值(通过这个特性进行检查最终查找结果)
2.有序序列中存在多少个元素与查找值相等: distance(it.first, it.second); //计算返回的两个迭代器之间的距离
- 条款46:考虑使用函数对象而不是函数作为STL算法的参数
- vector<double> vec;
- sort(vec.begin(), vec.end(), greater<double>()); //使用标准函数对象,不要自己写一个comp函数
当将一个函数进行参数传递时,其实传递的是该函数指针:
- sort(vector<double>::iterator first, vector<double>::iterator last, bool (*comp)(double, double));
函数指针参数抑制了内敛机制,而标准STL函数对象使用了内敛机制,所以sort比qsort快
- 条款47:避免产生"write only"代码
写清晰的代码,避免编写非常复杂的复合语句,软件的维护比开发过程通常消耗更长的时间
- 条款48:总是#include正确的头文件
1.几乎所有的标准STL容器都声明在与之同名的头文件中
2.除了4个STL算法之外,其余所有算法声明在<algorithm>中,这4个算法是 accumulate, inner_product, adjacent_difference, partial_sum 这4个声明在<numeric>中
3.所有迭代器声明在<iterator>中
4.标准函数子(如 less<T>), 函数适配器(bind2nd) 声明在<functional>中
- 条款49:学会分析与STL相关的编译器诊断信息
- 条款50:熟悉与STL相关站点
STL学习笔记(七) 程序中使用STL的更多相关文章
- Effective STL 学习笔记: Thread Safety and STL Container
Table of Contents 1. STL, Thread and SGI 2. STL and Lock 2.1. RAII 2.2. Use Lock in STL 1 STL, Threa ...
- STL学习笔记(第五章 STL组件)
STL组件 若干精心勾画的组件共同合作,构筑起STL的基础.这些组件最关键的是容器.迭代器和算法. 下图演示了STL组件之间的合作 容器(Containers) 容器类别(简称容器)用来管理一组元素. ...
- vue 3 学习笔记 (七)——vue3 中 computed 新用法
vue3 中 的 computed 的使用,由于 vue3 兼容 vue2 的选项式API,所以可以直接使用 vue2的写法,这篇文章主要介绍 vue3 中 computed 的新用法,对比 vue2 ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- [置顶] Effective STL 学习笔记
看Effective STL 作的一些笔记,希望对各位有帮助. 以下是50条条款及相关解释. 容器 1. 慎重选择容器类型,根据需要选择高效的容器类型. 2. 不要试图编写独立于容器类型的代码. 3. ...
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...
- Effective STL 学习笔记 32 ~ 33
Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
随机推荐
- Bootstrap历练实例:面板的标题
面板标题 我们可以通过以下两种方式来添加面板标题: 使用 .panel-heading class 可以很简单地向面板添加标题容器.to easily add a heading container ...
- Object-C知识点 (六) 开发中的技巧
本文主要介绍开发中的一些实用技巧 #pragma mark - 代码控制Home按键 [[UIApplication sharedApplication] performSelector:@selec ...
- 20180904 定时器setTimeout和setInterval回调问题
引用: setTimeout和setInterval两者的区别 setTimeout和setInterval的优缺点 setTimeout和setInterval详解 两者的作用都是在定时多少毫秒后回 ...
- 解决mysql出现的问题#1055 - Expression of SELECT list is not in GROUP BY clause and contains nonaggregated column this i
最近在学flask, 在访问主页时,一直出现1055错误,在网上找的解决方法是删除ONLY_FULL_GROUP_BY,当时是删除了,但是退出在进行select @@sql_mode时,仍出现ONLY ...
- Linux-Java安装
安装 yum -y install java-1.8.0-openjdk* Tomcat安装:到官网http://tomcat.apache.org/,然后找到Tomcat9下载地址 http://m ...
- laravel中redis各方法的使用
在laravel中使用redis自带方法的时候会发现许多原生的方法都不存在了,laravel对其进行了重新的封装但是在文档中并没有找到相关的资料最后在 \vendor\predis\predis\sr ...
- 【markdown】图片的处理
1st:  2ed: ![tip][id] [id]:base64string 本地图片 先把本地图片文件转换成base64位编码 然后把 link 替换成生成的base64编 ...
- python导出开发环境
1.导出开发环境的依赖包 本地开发完后,再把代码给别人之前,需要 pip freeze > pip123.txt 2.其他环境安装依赖包 pip install -r pip123.txt 其他 ...
- python网络-Socket之TCP编程(26)
一.TCP简介 1.TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TC ...
- QT入门学习笔记1:为什么要选QT及QT软件下载
为什么选择QT? Qt突出的优势: ◆ Qt 是基于 C++ 的一种语言扩展(Extention) C/C++ 目前还是一种很多人都在学习的语言. Qt的好处就在于Qt本身可以被称作是一种 C++ 的 ...