谁在用C++ STL?
Contents
C++用了四年了,这两天才把 《Effective STL》看了一遍。此书作为C++经典书系Effective三部曲之一,知名度与所受褒扬远不及另两本,个中缘由是否因为STL地位不济。所以今日以自己鄙陋的经历来谈一谈当前STL在C++程序员中的地位和使用状况。
大家知道STL中三大法宝:容器、迭代器和算法。我所经历的公司/团队STL的使用情况:
序号 | 团队规模 | 项目规模 | 容器 | 迭代器 | 高级迭代器 | 算法 | 高级算法 | funtional |
---|---|---|---|---|---|---|---|---|
1 | 5人以下,平均2年经验 | 10万以下 | 基本没有 | 基本没有 | 基本没有 | 基本没有 | 无 | 无 |
2 | 10人,平均2年经验 | 100万 | 较多 | 较多 | 较少 | 较少 | 极少 | 几无 |
3 | 10人,平均4年经验 | 100万 | 较多 | 较多 | 较少 | 极少 | 较少 | 有 |
(注:表中迭代器是指通过begin和end获取interator,而高级迭代器指back_inserter等迭代器生成器和内置迭代器;算法指sort,foreach, 高级算法指算法带if的形式)
看来,STL并不受大家欢迎,至少在我所呆过的团队里是这样的,为何如此?
洪水猛兽 (守旧)
容器(最简单的vector)几乎是大部分C++程序员最开始接触的STL组件,我也不例外。那是10年自己刚毕业那会儿,在一家公司实习,实现一个简单的图像显示和处理的Demo程序。里面图像数据最初是存储在原始的数组(char [])中。那一阵子在狂啃《C++ Primer》,里面提到C++程序员不应该使用这些原生的数组,应该用vector代替,于是自己将程序中的char []替换成了vector
舔着第一次用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用法麻木无知或畏惧使用:
- 各种容器的区别,如何使用容器兼容C接口
- for_each等函数存在的意义,如何写出函数式风格的代码
- 类的成员函数和同名全局函数的区别,比如set::find与std::find,map::remove与std::remove等等
- xxx_if函数的使用,如何写predicate
- function<>, bind函数的使用
- 一些惯用法,比如erase-remove
以上是我认为一个合格的C++开发应掌握的STL技巧。而掌握这些技巧,却是需要一段时间的练习,是否这一原因导致了一部分人对STL的无爱?因为即使不掌握这些技巧,功能是同样可以完成的。
曲高和寡 (风气)
语言的出现提高了人们交流的效率,设计模式的出现提高了软件人员的交流效率,但前提是交流的双方都懂才行。STL同样如此,我之蜜糖彼之砒霜,在一个不了解STL的团队中大量使用STL尤其是一些稍微“高级另类”的用法,难免遭人排斥。而且别人很难看懂你写的代码,指责你的代码难于维护,这并不是谁的错,这是一个道不同不幸与某的问题。
在一个不用、不了解STL的团队,喜爱STL之人会克制使用STL!
License 知识共享署名 3.0 中国大陆许可协议