条款43:算法调用优先于手写循环
class Widget {public: bool test();};vectorvec;
算法调用:
for_each(vec.begin(), vec.end(), mem_fun_ref(&Widget::test));
手写循环:
for(auto it = vec.begin(); it != vec.end(); ++it) it->test();
条款44:容器的成员函数优于同名算法
set ::iterator it = s.find(2012); //T(n) = O(logn)set ::iterator it = find(s.begin(), s.end(), 2012); //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算法的参数
vectorvec;sort(vec.begin(), vec.end(), greater ()); //使用标准函数对象,不要自己写一个comp函数
当将一个函数进行参数传递时,其实传递的是该函数指针:
sort(vector::iterator first, vector ::iterator last, bool (*comp)(double, double));
函数指针参数抑制了内敛机制,而标准STL函数对象使用了内敛机制,所以sort比qsort快
条款47:避免产生"write only"代码
写清晰的代码,避免编写非常复杂的复合语句,软件的维护比开发过程通常消耗更长的时间
条款48:总是#include正确的头文件
条款49:学会分析与STL相关的编译器诊断信息
条款50:熟悉与STL相关站点