C++之父Bjarne谈C++中的STL模板(二)

2014-11-24 13:16:37 · 作者: · 浏览: 21
删掉、为什么它使大多数C++程序员受益。这是个可怕的过程。Alex后来声明说这让他心痛。但是,这样的删减造就了现在知名的STL,并让它1994年10月在加拿大Waterloo的会议上成为ISO C++标准的一部分--而原始的和完全的STL都没有达到这个目标。对"简化STL"的必要修改也把标准延迟了一年以上。回想起来,我认为当时我们做的事情造成的伤害比预料的要小一些。

  在对采用STL的可能性的讨论中,我记得一件事情:Beman Dawes冷静地声明自己认为STL对于普通程序员来说过于复杂了,但是作为试验,他自己实现了10%,从此他不再认为STL超过了标准的难度。Beman是委员会中很少编写应用程序的人。不幸的是,委员会趋向于由建立编译器、类库和工具的人员所控制。

  在STL方面我信任Alex Stepanov。在STL之前,他花了十年以上的时间,用一些无用的语言(例如Scheme和Ada)来研究基本的想法和技术。但是,Alex第一个坚持要求其他人一起参与。David Musser和Alex在泛型编程方面一起工作了约二十年,Meng Lee与他一起在HP工作,帮助他编写最初的STL。Alex和Andrew Koenig之间的电子邮件讨论也有帮助作用。除了苛刻的试验之外,我的贡献很小。我建议与内存相关的所有信息都集中到一个对象中--就形成了分配器(allocator)。我还草拟了Alex想法的初始需求表,建立表格记录STL算法和类对它们的模板参数的要求。这些需求表实际上表明这种语言的表达能力不足--这种需求应该成为代码的一部分。

 1.1 STL的理念

  那么什么是STL呢?到目前为止,它作为标准C++的一部分已经快十年了,因此你的确应该知道它,但是如果你不熟悉现代的C++,那么我就有必要对它的想法和语言使用方式作一些简单的介绍。

  我们来考虑一个问题:把对象存储在容器中,并编写算法来操作这些对象。我们按照直接、独立和概念的混合表现方式来考虑这个问题。自然地,我们希望能够在多种容器(例如列表、向量、映射)中存储多种类型(例如整型、Point、Shape)的对象,并在容器中的对象上应用大量的算法(例如排序、检索、积聚)。此外,我们希望使用的这些对象、容器和算法都是静态类型安全的、尽可能地快速、尽可能地简洁、不冗长、易于 阅读。同时实现这些目标并不容易。实际上,为了解决这个难题,我差不多花费了十年还是没有找到成功的方法。


  STL解决方案是以带元素类型的参数化容器以及与容器完全分离的算法为基础的。容器的每种类型都提供一种迭代子(iterator)类型,只使用这些迭代子就可以实现对容器中所有元素的访问。通过这种方式,我们可以编写算法来使用迭代子而不用知道提供迭代子的容器的信息。每种迭代子类型与其它类型都是完全独立的,除非要为必要的操作(例如*和++)提供了相同语义(semantics)。我们可以用图