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(2012);    //T(n) = O(logn)
set<int>::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算法的参数

 

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相关站点

 

posted @ 2013-11-26 21:43  skyline09  阅读(462)  评论(0编辑  收藏  举报