Effective STL 笔记-第7章 在程序中使用STL
7 在程序中使用STL
第 43 条:算法调用优先于手写的循环。
调用算法优于手写循环:
- 效率:算法比手写的循环效率更高。
- 正确性:手写循环比使用算法容易出错。
- 可维护性:使用算法的代码更加简洁明了。
例子:P155,
算法的名称表明了它的功能,而 for、while、do 循环不能。
手写循环需要维护迭代器的有效性。
第 44 条:容器的成员函数优先于同名的算法。
原因:
- 成员函数往往速度快。
- 成员函数通常与容器结合得更加紧密。(同样的名称做不同的事情)
对于 map 和 multimap 而言
- 成员函数可以获得对数时间的性能。
- 成员函数的相同是等价,而算法是相等。
- 它们的成员函数只统计检查每个 pair 对象的键部分。而算法同时检查键和值/(key,value)对。
对于 list 而言,list 成员函数只是简单地维护指针,可以提供更好的性能。list 的 remove、remove_if、unqiue 则实实在在的删除了元素。sort 算法不能直接应用于 list,因为 sort 需要随机访问迭代器,而 list 的迭代器是双向迭代器。
第 45 条:正确区分 count、find、binary_search、lower_bound、upper_bound 和 equal_range。
存在性测试:
if (count(lw.begin(), lw.end(), w) != 0) ...
if (find(lw.begin(), lw.end(), w) != lw.end()) ...
equal_range 返回一个迭代器,第一个迭代器等于 lower_bound 返回的迭代器,第二个迭代器等于 upper_bound 返回的迭代器。它可以同时完成 find 的工作和 count 的工作。
第 46 条:考虑使用函数对象而不是函数作为 STL 算法的参数。
sort(v.begin(), v.end(), doubleGreater);
sort(v.begin(), v.end(), greater<double>());
使用 greater<double>()
的 sort 调用比使用 doubleGreater 的 sort 调用快得多。原因:函数内联,sort 不包含函数调用。
抽象性利益:C++ 的 sort 算法性能总是优于 C 的 qsort。在运行时,sort 算法以内联方式调用它的比较函数,而 qsort 则通过函数指针调用它的比较函数。
使用函数对象,可以让你的程序正确地通过编译,避免语言本身的缺陷。
第 47 条:避免产生 “直写型” (write only)的代码。
直写型代码:虽然很容易编写,但是难以阅读和理解。
第 48 条:总是包含(#include)正确的头文件。
- 几乎所有的标准 STL 容器都被声明在与之同名的头文件中。set 和 map 是个例外,
声明了 set 和 multiset, - 除了 4 个 STL 算法以外,其他所有的算法都被声明在
中。这 4 个算法是 accumulate、inner_product、adjacent_difference、partial_sum,它们被声明在 中。 - 特殊类型的迭代器,包括 istream_interator、istreambuf_interator,被声明在
中。 - 标准的函数子和函数子配接器被声明在头文件
中。