Effective STL 笔记-第7章 在程序中使用STL

7 在程序中使用STL

第 43 条:算法调用优先于手写的循环。

调用算法优于手写循环:

  • 效率:算法比手写的循环效率更高。
  • 正确性:手写循环比使用算法容易出错。
  • 可维护性:使用算法的代码更加简洁明了。

例子:P155,

算法的名称表明了它的功能,而 for、while、do 循环不能。

手写循环需要维护迭代器的有效性。

第 44 条:容器的成员函数优先于同名的算法。

原因:

  1. 成员函数往往速度快。
  2. 成员函数通常与容器结合得更加紧密。(同样的名称做不同的事情)

对于 map 和 multimap 而言

  1. 成员函数可以获得对数时间的性能。
  2. 成员函数的相同是等价,而算法是相等。
  3. 它们的成员函数只统计检查每个 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, 声明了 map 和 multimap。
  • 除了 4 个 STL 算法以外,其他所有的算法都被声明在 中。这 4 个算法是 accumulate、inner_product、adjacent_difference、partial_sum,它们被声明在 中。
  • 特殊类型的迭代器,包括 istream_interator、istreambuf_interator,被声明在 中。
  • 标准的函数子和函数子配接器被声明在头文件 中。

第 49 条:学会分析与 STL 相关的编译器诊断信息。

第 50 条:熟悉与 STL 相关的 web 站点。

SGI STL 站点

STLport 站点

Boost 站点

posted @ 2021-08-19 15:58  CoolGin  阅读(59)  评论(0编辑  收藏  举报