对STL(Standard Template Library)的简短描述并不足以体现其设计上的过人之处,接下来的文字不过是鼓励你深入学习STL的“开胃小菜”。
STL并不仅仅是一个库,它更是一种优秀的思想以及一套约定。 STL包含三大组件:容器、算法和迭代器。容器用于容纳和组织元素;算法执行操作;迭代器则用于访问容器中的元素。这些都不是什么新东西,许多传统的程序库也都包含类似的组件,并且许多程序也都是采用模板实现而成。
STL的优秀思想在于:容器与容器上执行的算法之间无需彼此了解,这种戏法是通过迭代器实现的。 迭代器类似于指针(实际上指针就是一种STL迭代器)。像指针一样,迭代器可以指向序列中的一个元素,也可以对其进行解引用,以便获得它所指向的对象的值。我们可以像操纵指针那样操纵迭代器,使其指向序列中不同的元素。
STL迭代器既可以是预定义的指针,也可以是用户自定义的类类型,当然,这种类型需要重载适当的操作符,以便与预定义指针拥有相同的使用语法。
STL容器是对数据结构的一种抽象,以类模板的方式实现而成。由于具有不同的数据结构,因此不同的容器以不同的方式来组织元素,以便对存取或操纵进行优化。STL定义了7个(算上string则是8个)标准容器,另外,一些被广泛接受的非标准容器也得到了实现。
STL算法是对函数的一种抽象,采用函数模板实现。大多数STL算法用于处理一个或多个序列的值,其中每一个序列由一对有序的迭代器定义。其中第一个迭代器指向序列的第一个元素,第二个迭代器则指向序列最后一个元素之后的那个位置。如果两个迭代器指向同一个位置,那么它们就定义了一个空序列。
迭代器提供了一种使容器和算法协同工作的机制。一个容器可以生成一对迭代器来指定一个元素序列(可以是全部元素,也可以只是一个子区间),而算法则对该序列进行操作。采用这种方式,容器和算法可以紧密地协作,同时还可以保持彼此不知情。 除了容器、算法和迭代器之外,STL还定义了大量的辅助性功能。算法和容器可以采用函数指针和函数对象根据需要进行定制,而这些函数对象又可以通过形形色色的对象适配器进行配接和联合。
容器也可以利用容器适配器进行配接,从而将容器的接口修改为栈、队列和优先队列。 STL对约定有着很强的依赖。容器和函数对象必须通过一套标准的嵌套类型名字对其自身进行描述。容器和函数对象适配器均要求成员函数具有特定的名字并包含特定的类型信息。算法要求传递给它的迭代器支持特定的操作并能够识别是什么样的操作。当使用或扩展STL时,如果弃约定而不顾,那么同时也就放弃了美梦成真的希望。遵守约定,将拥有简单而轻松的生活。
STL约定并未指明具体的实现细节,但对实现指定了效率方面的约束。此外,由于STL是一个模板库,许多优化和性能调整可以在编译期进行。前面提到的命名和信息约定对编译期优化具有显著的影响。一般而言,STL的效率可以与专家手写代码的效率相媲美,而与普通程序员和程序员小组的手写代码相比则明显胜出一筹。另外,使用STL可以使代码变得更清晰,更易于维护。 学习STL,并广泛使用STL吧!