条款43:尽量用算法调用代替手写循环
有三个理由:
效率:算法通常比程序员产生的循环更高效。
正确性:写循环时比调用算法更容易产生错误。
可维护性:算法通常使代码比相应的显式循环更干净、更直观。
条款44:尽量用成员函数代替同名的算法
存在既是道理。
条款45:注意count、find、binary_search、lower_bound、upper_bound和equal_range的区别
了解这些函数的依赖和特性。
条款46:考虑使用函数对象代替函数作算法的参数
把STL函数对象——化装成函数的对象——传递给算法所产生的代码一般比传递真的函数高效。原因是内联。另一个用函数对象代替函数的原因是它们可以帮助你避免细微的语言陷阱。
条款47:避免产生只写代码
不能读和理解的软件不能被维护,不能维护的软件几乎没有不值得拥有。最后,这样的代码完全不高效。
条款48:总是#include适当的头文件
几乎所有的容器都在同名的头文件里,比如,vector在<vector>中声明,list在<list>中声明等。例外的是<set>和<map>。<set>声明了set和multiset,<map>声明了map和multimap。
除了四个算法外,所有的算法都在<algorithm>中声明。例外的是accumulate(参见条款37)、inner_product、adjacent_difference和partial_sum。这些算法在<numeric>中声明。
特殊的迭代器,包括istream_iterators和istreambuf_iterators(参见条款29),在<iterator>中声明。
标准仿函数(比如less<T>)和仿函数适配器(比如not1、bind2nd)在<functional>中声明。
条款49:学习破解有关STL的编译器诊断信息
对于vector和string,迭代器有时是指针,所以如果你用迭代器犯了错误,编译器诊断信息可能会提及涉及指针类型。例如,如果你的源代码涉及vector<double>::iterator,编译器消息有时会提及double*指针。(一个值得注意的例外是当你使用来自STLport的STL实现,而且你运行在调试模式。那样的话,vector和string的迭代器干脆不是指针。对STLport和它调试模式的更多信息,转向条款50。)
提到back_insert_iterator、front_insert_iterator或insert_iterator的消息经常意味着你错误调用了back_inserter、front_inserter或inserter,一一对应,(back_inserter返回back_insert_iterator类型的对象,front_inserter返回front_insert_iterator类型的对象,而inserter返回insert_iterator类型的对象。关于使用这些inserter的信息,参考条款30。)如果你没有调用这些函数,你(直接或间接)调用的一些函数做了。
类似地,如果你得到的一条消息提及binder1st或binder2nd,你或许错误地使用了bind1st或bind2nd。(bind1st返回binder1st类型的对象,而bind2nd返回binder2nd类型的对象。)
输出迭代器(例如ostream_iterator、ostreambuf_iterators(参见条款29),和从back_inserter、front_inserter和inserter返回的迭代器)在赋值操作符内部做输出或插入工作,所以如果你错误使用了这些迭代器类型之一,你很可能得到一条消息,抱怨在你从未听说过的一个赋值操作符里的某个东西。为了明白我的意思,试着编译这段代码:
vector<string*> v; // 试图打印一个
copy(v.begin(), v.end(), // string*指针的容器,
ostream_iterator<string>(cout, "/n")); // 被当作string对象
你得到一条源于STL算法实现内部的错误信息(即,源代码引发的错误在<algorithm>中),也许是你试图给那算法用的类型出错了。例如,你可能传了错误种类的迭代器。要看看这样的用法错误是怎样报告的,通过把这段代码喂给你的编译器来启发(并愉快!)自己:
list<int>::iterator i1, i2; // 把双向迭代器
sort(i1, i2); // 传给一个需要随机访问迭代器的算法
你使用常见的STL组件比如vector、string或for_each算法,而编译器说不知道你在说什么,你也许没有#include一个需要的头文件。正如条款48的解释,这问题会降临在长期以来都可以顺利编译而刚移植到新平台的代码。
条款50:让你自己熟悉有关STL的网站
SGI STL网站,http://www.sgi.com/tech/stl/。
STLport网站,http://www.stlport.org/。
Boost网站,http://www.boost.org/