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; ...
随机推荐
- Exchange邮箱搭建
出现的问题: System.Runtime.InteropServices.COMException(0x8004020F): The server rejected one or more reci ...
- css3 设置滚动条的样式
::-webkit-scrollbar { width: 14px; height: 14px; } ::-webkit-scrollbar-track, ::-webkit-scrollbar-th ...
- Noip 训练指南
目录 Noip 训练指南 图论 数据结构 位运算 期望 题解 Noip 训练指南 目前完成 \(4 / 72\) 图论 [ ] 跳楼机 [ ] 墨墨的等式 [ ] 最优贸易 [ ] 泥泞的道路 [ ] ...
- python入门:模拟简单用户登录(自写)
#!/usr/bin/env python # -*- coding: utf-8 -*- #模拟简单用户登录(自写) import getpass a = raw_input("Pleas ...
- 通过session模拟登陆
import requests # 这个练习对比的是上一个登陆练习,这个是不用自己传入cookie参数,而是利用session方法登陆 # 实例化一个session session = request ...
- MyEclipse访问MSSQL2008数据库
首先到微软网站http://www.microsoft.com/zh-cn/download/details.aspx?id=21599下载sqljdbc_3.0.1301.101_chs.exe, ...
- Centos7 开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机解决方法
开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机,也无法重新安装系统,解决方法:开机进入BIOS , 关闭ACPI选项即可正常开机
- Alpha版(内部测试版)发布
首先通过微信扫吗下载我们的软件校园服务,首先进去登录界面没账号点击注册,注册完就可以登录了,进去界面我们在二手交易这项功能里我们即可以事卖家又可以是买家如果我们卖东西点击商品出售,填写商品信息,商品图 ...
- Flask-用户角色及权限
app/models.py class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=T ...
- hdu3487Play with Chain
Play with Chain Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...