学习笔记-Effective STL-使用STL编程

本文提供了使用STL的实用建议,如用算法调用代替手写循环提高效率和正确性,选择成员函数而非同名算法增强代码清晰度,区分不同搜索函数的功能,利用函数对象优化算法参数,并强调了代码可读性和维护性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条款43:尽量用算法调用代替手写循环

有三个理由:

效率:算法通常比程序员产生的循环更高效。

正确性:写循环时比调用算法更容易产生错误。

可维护性:算法通常使代码比相应的显式循环更干净、更直观。

条款44:尽量用成员函数代替同名的算法

存在既是道理。

条款45:注意countfindbinary_searchlower_boundupper_boundequal_range的区别

了解这些函数的依赖和特性。

条款46:考虑使用函数对象代替函数作算法的参数

       STL函数对象——化装成函数的对象——传递给算法所产生的代码一般比传递真的函数高效。原因是内联。另一个用函数对象代替函数的原因是它们可以帮助你避免细微的语言陷阱。

条款47:避免产生只写代码

       不能读和理解的软件不能被维护,不能维护的软件几乎没有不值得拥有。最后,这样的代码完全不高效。

条款48:总是#include适当的头文件

       几乎所有的容器都在同名的头文件里,比如,vector<vector>中声明,list<list>中声明等。例外的是<set><map><set>声明了setmultiset<map>声明了mapmultimap

除了四个算法外,所有的算法都在<algorithm>中声明。例外的是accumulate(参见条款37)、inner_productadjacent_differencepartial_sum。这些算法在<numeric>中声明。

特殊的迭代器,包括istream_iteratorsistreambuf_iterators(参见条款29),在<iterator>中声明。

标准仿函数(比如less<T>)和仿函数适配器(比如not1bind2nd)在<functional>中声明。

条款49:学习破解有关STL的编译器诊断信息

       对于vectorstring,迭代器有时是指针,所以如果你用迭代器犯了错误,编译器诊断信息可能会提及涉及指针类型。例如,如果你的源代码涉及vector<double>::iterator,编译器消息有时会提及double*指针。(一个值得注意的例外是当你使用来自STLportSTL实现,而且你运行在调试模式。那样的话,vectorstring的迭代器干脆不是指针。对STLport和它调试模式的更多信息,转向条款50。)

提到back_insert_iteratorfront_insert_iteratorinsert_iterator的消息经常意味着你错误调用了back_inserterfront_inserterinserter,一一对应,(back_inserter返回back_insert_iterator类型的对象,front_inserter返回front_insert_iterator类型的对象,而inserter返回insert_iterator类型的对象。关于使用这些inserter的信息,参考条款30。)如果你没有调用这些函数,你(直接或间接)调用的一些函数做了。

类似地,如果你得到的一条消息提及binder1stbinder2nd,你或许错误地使用了bind1stbind2nd。(bind1st返回binder1st类型的对象,而bind2nd返回binder2nd类型的对象。)

输出迭代器(例如ostream_iteratorostreambuf_iterators(参见条款29),和从back_inserterfront_inserterinserter返回的迭代器)在赋值操作符内部做输出或插入工作,所以如果你错误使用了这些迭代器类型之一,你很可能得到一条消息,抱怨在你从未听说过的一个赋值操作符里的某个东西。为了明白我的意思,试着编译这段代码:

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组件比如vectorstringfor_each算法,而编译器说不知道你在说什么,你也许没有#include一个需要的头文件。正如条款48的解释,这问题会降临在长期以来都可以顺利编译而刚移植到新平台的代码。

条款50:让你自己熟悉有关STL的网站

SGI STL网站,http://www.sgi.com/tech/stl/

STLport网站,http://www.stlport.org/

Boost网站,http://www.boost.org/

http://boost.sourceforge.net/

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值