C++用了四年了,这两天才把 《Effective STL》看了一遍。此书作为C++经典书系Effective三部曲之一,知名度与所受褒扬远不及另两本,个中缘由是否因为STL地位不济。所以今日以自己鄙陋的经历来谈一谈当前STL在C++程序员中的地位和使用状况。

大家知道STL中三大法宝:容器、迭代器和算法。我所经历的公司/团队STL的使用情况:


序号团队规模项目规模容器迭代器高级迭代器算法高级算法funtional
15人以下,平均2年经验10万以下基本没有基本没有基本没有基本没有
210人,平均2年经验100万较多较多较少较少极少几无
310人,平均4年经验100万较多较多较少极少较少

(注:表中迭代器是指通过begin和end获取interator,而高级迭代器指back_inserter等迭代器生成器和内置迭代器;算法指sort,foreach, 高级算法指算法带if的形式)


看来,STL并不受大家欢迎,至少在我所呆过的团队里是这样的,为何如此?

洪水猛兽 (守旧)

容器(最简单的vector)几乎是大部分C++程序员最开始接触的STL组件,我也不例外。那是10年自己刚毕业那会儿,在一家公司实习,实现一个简单的图像显示和处理的Demo程序。里面图像数据最初是存储在原始的数组(char [])中。那一阵子在狂啃《C++ Primer》,里面提到C++程序员不应该使用这些原生的数组,应该用vector代替,于是自己将程序中的char []替换成了vector。而后发现一些图像算法执行慢了好多,遂请教mentor,mentor是名校的doctor,不编程久已,他并没用过STL,但提出不要用STL,不要追时髦、偷懒,老老实实的写“C”代码就好了。

舔着第一次用STL的伤口,念着mentor的教诲,在这家公司的第一年里自己后来好像就不再关注和使用STL。同期的C++ Programmer共四人,一个工作1年,另两个更久些,那时我们在“不赶时髦”上很团结,大家愉快的使用着VC6,且都不使用STL。

这就是某些老式小型软件公司一些C++程序员对待STL的态度:排斥守旧,其中缘由高校的计算机教育脱不了干系。

当然有个人和特殊业务场景也会排斥STL:为何某些公司不容许使用C++ STL

玄之又玄 (畏惧)

C++本来有有很多不易掌握的细节。而STL同样如此,简单强大,但有微妙的陷阱。就拿Effective STL来说,条款1:慎重的选择容器类型中,就有大量自己不曾掌握模棱两可的点:

  • string的swap会导致迭代器失效
  • 容器的内部可能有引用计数
  • 插入、删除操作的回滚能力

当然有些细节无需掌握,但就我接触到的C++程序员大都使用STL的最简单用法: 使用vector和map存储一些数据,而对稍微高级点的STL用法麻木无知或畏惧使用:

  1. 各种容器的区别,如何使用容器兼容C接口
  2. for_each等函数存在的意义,如何写出函数式风格的代码
  3. 类的成员函数和同名全局函数的区别,比如set::find与std::find,map::remove与std::remove等等
  4. xxx_if函数的使用,如何写predicate
  5. function<>, bind函数的使用
  6. 一些惯用法,比如erase-remove

以上是我认为一个合格的C++开发应掌握的STL技巧。而掌握这些技巧,却是需要一段时间的练习,是否这一原因导致了一部分人对STL的无爱?因为即使不掌握这些技巧,功能是同样可以完成的。

曲高和寡 (风气)

语言的出现提高了人们交流的效率,设计模式的出现提高了软件人员的交流效率,但前提是交流的双方都懂才行。STL同样如此,我之蜜糖彼之砒霜,在一个不了解STL的团队中大量使用STL尤其是一些稍微“高级另类”的用法,难免遭人排斥。而且别人很难看懂你写的代码,指责你的代码难于维护,这并不是谁的错,这是一个道不同不幸与某的问题。

在一个不用、不了解STL的团队,喜爱STL之人会克制使用STL!