条款43:算法调用优先于手写循环
class Widget { public: bool test(); }; vector<Widget> vec;
算法调用:算法
for_each(vec.begin(), vec.end(), mem_fun_ref(&Widget::test));
手写循环:less
for(auto it = vec.begin(); it != vec.end(); ++it) it->test();
算法调用优于手写循环:效率更高; 正确性更容易; 可维护性更高函数
条款44:容器的成员函数优于同名算法
优先使用容器的成员函数: 速度更快;与容器结合更紧密性能
set<int>::iterator it = s.find(2012); //T(n) = O(logn) set<int>::iterator it = find(s.begin(), s.end(), 2012); //T(n) = O(n)
使用关联容器时,优先考虑使用成员函数形式的 find、count,能够得到对数时间性能spa
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,仅仅代表查找值是否在有序序列中code
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函数
当将一个函数进行参数传递时,其实传递的是该函数指针:blog
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相关站点