有机会应该去了解下STL背后的数学思想_C++标准程序库书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > C++标准程序库 > 有机会应该去了解下STL背后的数学思想
xiaohanyu C++标准程序库 的书评 发表时间:2012-05-22 16:05:08

有机会应该去了解下STL背后的数学思想

此书在amazon.com上几乎得到了全五星的评论。800页的大部头,我大概花了一周不到的时间基本读完,并动手敲完了前10章的绝大部分demo代码。

STL的设计思想(通过迭代器将数据结构和算法分离,获得通用性的程序组件)是此书的精华。其余的部分诸如复数complex,valarray,bitset,strings,国际化等等,了解一下即可,没有必要深究。还有令人纠结的auto_ptr,本身就是一个设计失败的产物,当一个组件给你提供了3条功能却告诉你为了使用这3条功能你需要遵守10大戒律的时候,这个组件本身的设计没准就是有问题的。很不幸,在我看来,auto_ptr就是这样的组件,使用它会带上很大的心智负担(C++的很多特性都是如此,看上去很强大很花哨,但深究起来发展这里面的陷阱很多,会给使用者带来很大的心智负担)。

此书中还有很多句子在前后反复强调,一再呼应,比如中译本的P444和P453,都有这样“最后新增加的一个pop()调用动作……程序输出如下:”这样的句子。再比如统一类型的很多算法,其使用要点和能力限制都是差不多的,书中也反复的强调。这当然可以拿德国人的严谨性说事,但也显得书籍比较罗嗦。这部分也占了很大的篇幅。

去除以上两部分,此书最有价值的东西就在300页左右,也就是第5-10章的内容,细说起来,就是STL,容器、算法、迭代器、仿函数。

STL的核心设计思想是数据结构和算法的分离,这个从某种意义上来讲,是和OOP的思想背道而驰的。所以在STL中只用到了Object-based的东西,却没有用到Object-oriented,STL没有用到继承。STL之父Alexander Stepanov也并不是100%赞同OOP的。Alexander本身是俄罗斯某大学数学系出身,因此STL背后有着很深刻的数学思想,为此Alexander专门写了一本书,"The Elements ofProgramming"。

我的数学基础并不能参透STL这些背后的数学思想,不过仅有的一些lisp和scheme的知识,倒让我在STL中的某些组件里面,找到了一些似曾相识的东西。

比如像functor(仿函数),我觉得仿函数的本质在于将函数的地位提升到和C++ class同样的一等公民的位置。在scheme中,函数(操作)和数据一样,都可以作为一等公民,可以当做参数传递、返回。而在C++中,数据才是一等公民,C++ class的各种机制(构造函数、析构函数、运算符重载等),无非也就是让用户自定义的class拥有和built-in的类型一样的使用接口和特性(比如像std::complex和int)。但函数本身在C++中并不能通过很轻易的方式成为一等公民。要想像普通数据一样传递函数,需要用到函数指针。而functor的存在,就是为了通过重载operator(),来实现传递“函数(操作)”的目的。至于优点和好处,此书上已经说的很清楚了。

再比如像transform()、for_each()、accumulate()算法,如果你读过SICP前两章,你就会发现这其实和lisp/scheme里面的map/reduce函数有异曲同工之妙。MapReduce?没错,就是那个MapReduce,google的那个MapReduce。

语言是会影响人的思维的。所以我并不赞同“语言和工具不重要”的这种论调,没错,语言是相通的,C++可以做到的事情,汇编一样可以,本质上大家都是Turing-Complete的。但是Turing-Complete并不意味着相同的表现形式和使用难度,多学几种语言,多了解几种思想,不盲目崇拜,跳出语言的框架去学习语言,是很重要的。

扯远了,回头说说阅读此书的基础和后续吧。首先需要对C++有比较好的了解,如果连const、reference都搞不清楚,还是不要读此书了。其次最好对模板技术有一些了解,最好能看些"C++ Template: The Complete Guide",了解下type traits这类技术。

读完此书后,找个机会动手实现下STL的各种container和一些基础算法,Mark A.Weiss有一本老书"Data Structures and Problem Solving Using C++",包含了很多STL的实现代码和STL的应用,很不错,可惜现在很难搞到。有机会再去读读侯先生的"STL源码剖析"。当然,更高阶的,什么c++ template metaprogramming,我就不继续了。

顺便,侯先生在此书中不遗余力的推荐它的译作和著作,我总算是没抵住诱惑,买了本"STL源码剖析",正在消化中。

展开全文
有用 34 无用 3

您对该书评有什么想说的?

发 表

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

对“有机会应该去了解下STL背后的数学思想”的回应

xiaohanyu 2016-08-17 21:02:27
曾阿牛 :函数对象(仿函数)感觉很难懂。

可以理解成一个更方便的封装成 object 的函数指针

曾阿牛 2016-08-17 21:01:09

函数对象(仿函数)感觉很难懂。

xiaohanyu 2015-07-22 16:13:28

@手机用户 2947751: 我知道的,不过我已经好久不再关注 C++ 相关了

手机用户2947751 2015-07-22 15:43:59

666,auto_ptr在 c++11里面被另外三个智能指针给取代了,你知道么,貌似你写这篇文章的时候c++11已经出来了吧

城北大洋桃有毛 2015-04-27 10:28:15

楼上两位,你们总是低估别人的执行力吗?

双面夜莺 2015-04-26 11:14:46

楼主蛮会营销的 头两句可证

Manson 2015-04-22 16:00:00

人家几年写的东西,你一周就能看完,这得多高智商?

HelloCode 2015-03-31 09:11:04

一边刷Leetcode,一边学习STL,效率很高。

踌躇月光 2014-10-13 14:53:02

一周不到,你看清楚了吗?就在这儿大放厥词

liuh 2013-11-19 11:21:47

对stl的所有了解来自于《C++Primer》第四版。。

城北大洋桃有毛 2013-11-18 21:06:38

这么犀利? 楼主太强了。

卜库塔 2013-11-16 13:56:00

800页的小说我一周也看不完。。。

xiaohanyu 2013-08-08 14:13:55

@逆铭睡眼惺忪地 谢谢你的回应,你说的我都赞同的。我也看了一些functional programming的东西,确实还是能够从更高的角度上理解c++的。

EDFward 2013-08-08 13:48:07

书比较啰嗦的原因可能在于定位吧:A Tutorial and Reference,随时翻阅的工具书,所以会不厌其烦的重新提那些要点。

E.T 2013-08-06 17:56:39

赞楼上

逆铭睡眼惺忪地 2013-08-06 13:21:44

私以为不该从C++入手去探求其思想,而应该从更正常的语言那里了解了这些思想再回头看C++如何带着镣铐跳舞。从实际应用的角度权衡它有时可以是最佳选择,但想从这里入手学习思想什么的几乎总是事倍功半吧。

functor不过是没有lambda时的难用的替代品罢了,起个高端的名字也不能把缺陷变成feature。C++对map、reduce这样的高阶函数本来支持有限,在lambda引入前更是半残;想了解这类思想的话从C#的LINQ入手都更合适。至于迭代器(和更一般情况下泛型)所带来的可扩展性,如果把模板简化地看做编译期的鸭子类型的话,这不过是面向接口编程的结果,从动态语言就能找到更友好的例子,比如Ruby的Mixin。又比如模板元的图灵完备性来源于其递归结构(和对整数操作的支持),如果想了解怎么在没有循环结构和副作用的情况下实现各种功能,去看看正常点的函数式语言就好了,何必把生命浪费在和c++编译器的斗争上。当然要是C++有完善一点的宏支持,或者它自己本身完善一些,谁会这么蛋疼。

zèt 2013-05-30 22:41:04

STL的思想看这本--http://book.douban.com/subject/3802826/

[已注销] 2013-05-02 13:59:00

一周不到。。

我没失踪 2013-04-02 04:38:32

"STL的核心设计思想是数据结构和算法的分离,这个从某种意义上来讲,是和OOP的思想背道而驰的。所以在STL中只用到了Object-based的东西,却没有用到Object-oriented,STL没有用到继承。STL之父Alexander Stepanov也并不是100%赞同OOP的"

这点上,不是很赞同诶。
1) effective c++ 专门有两三章讲分离是为了更好的OOP。OOP有三个基本点:encapsulation(in which case the state is kept separate。在 stl 里面,iterator,traits不就是体现了这一点么?);2)inheritance(stl源码有大量的继承);3)polymorphism;
2)我觉得有挺多设计思想的,把说烂了的OOP用得相当有意思,粒度把握得很值得思考;
3)STL 宏真是一大亮点。

罗源 2012-12-24 10:38:56

Mark A.Weiss有一本老书"Data Structures and Problem Solving Using C++",包含了很多STL的实现代码和STL的应用,很不错,可惜现在很难搞到。
--
试试淘宝吧。