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; ...
随机推荐
- 关于"动态语言" "静态语言" "静态类型语言" "动态类型语言"的区别
参考链接:关于“编译型”“解释型”“动态语言”“静态语言”“动态类型语言”“静态类型语言”的区分以及优缺点(汇总整理) 很多人把这两类混为一谈,但是这是完全不同的两个概念!!! 动态和静态语言主要看的 ...
- 进入JVM的世界:《深入理解JVM虚拟机》-- 思维导图
进入JVM的世界:<深入理解JVM虚拟机>-- 思维导图 之前一直都是零零散散的看了些JVM的知识,心想这样不行啊!于是便抽空看了一下这本神书,阅罢,醍醐灌顶.豁然开朗.真正的是知其然,更 ...
- poj-3278 catch that cow(搜索题)
题目描述: Farmer John has been informed of the location of a fugitive cow and wants to catch her immedia ...
- Linux学习-可唤醒停机期间的工作任务
什么是 anacron anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非 24 小 时一直启动的 Linux 系统的 crontab 的执行 ...
- jmeter throughput controller
工作方式:可以按规定次数执行,也可以选择按百分比执行,其中的百分比必须是10,20,30类似的整数. 使用场景:可以随机的去按百分比浏览网址. 以下是具体脚本:
- 小米手机安装 charles 证书,提示“没有可安装的证书”
错误环境: 1. Mac 下的 charles 2. 小米手机(MI 6 MUI 9.6 ,Android 8.x) 错误提示: 安装 charles 证书时,提示“没有可安装的证书” 解决方法: 1 ...
- luogu4016 负载平衡问题
网络流不用动脑子的好爽啊 #include <iostream> #include <cstring> #include <cstdio> #include < ...
- jmeter进行dubbo接口测试
最近工作中接到一个需求,需要对一个MQ消息队列进行性能测试,测试其消费能力,开发提供了一个dubbo服务来供我调用发送消息. 这篇博客,介绍下如何利用jmeter来测试dubbo接口,并进行性能测试. ...
- adb devices 找不到夜神模拟器解决方法
先打开命令行窗口,输入adb devices,查看连接信息,大致意思是sdk的adb版本与夜神的adb版本不一致,导致. C:\Users\cz9025>adb devices List of ...
- kNN的维数灾难与PCA降维
主成分分析 PCA 协方差矩阵 假设我们有 \[ X = \begin{pmatrix}X_1\\X_2\\\vdots\\X_m\end{pmatrix}\in\mathbb{R}^{m\times ...