7.9 Pohl博士的建议
?使用顺序容器时,首先考虑vector,其次是deque,最后是list。
?计算时要使用最高效的容器。
?适配时要记住:基础结构决定效率。
?使用迭代器参数取代容器变量。
?使用与函数兼容的最弱迭代器。
?计算时要使用最高效的算法。
?修改或配接已经存在的STL算法。
?理解函数的构成。
?确定厂商实现了标准。
vector是对数组的一种简单概括,它通常是最容易使用的容器,并且也是程序员最熟悉的容器。在大量的类操作中,它经常是效率最高的,应该成为你对容器的默认选择。deque是第二有用的容器,它最强大的特性是可以在线性时间内在数据结构的两端添加数据;它也支持随机访问。list在很多方面都是最“昂贵”的容器类,它的主要优点是可以在常量时间内插入和删除内部元素,而无需删除已经存在的迭代器值。选择容器的另外一个依据是要根据最常见的操作问题进行选择。
在容器间切换时相对容易一些。构造容器时,可以使用来自其他容器的迭代器区间作为参数。不用担心对一些问题使用了多种表示方式,这些问题体现了对空间操作组合成本的一种权衡。STL的关键是使用了更高效的算法,这通常也包括对恰当的容器的选择。
容器适配产生了一些支撑接口,例如栈或优先队列,它们隐藏了基础的容器实现。尽管如此,不同的实现还是导致了最终产生的数据结构的效率差异。选择适配器时应该考虑对问题最重要的操作和空间限制,如果有疑惑就仔细分析你的程序。
迭代器序列不依赖于任何一种特殊类型的容器。容器类型的表示能力要小于迭代器区间,因此,使用迭代器序列会让算法更通用,并且也提高了复用性。
在泛型程序设计中,要在不损失程序运行效率的前提下让程序尽可能通用。这就产生了规则2:也就是说使用与计算实现效率兼容的最弱迭代器类型。
我们都期望STL算法能更有效。通用排序算法是一种效率更高的快速排序方法,大多数情况下,它要比C标准库中的qsort()更受欢迎。
在前面介绍的数值积分的例子中,STL子程序非常易于使用和配接,它不需要借助于特殊的代码就可以完成重要的计算。很多情况下,由于缺少对构成函数的数学概念的理解,使程序员很难完全掌握适配技术。函数型语言或基于逻辑的语言(例如Lisp、ML、Scheme和Prolog)中使用了很多这样的概念,读懂用这些语言编写的例子能更好地理解如何将这些思想应用在STL中。
很多厂商的产品改变了STL标准,这给厂商的模板编译器的支持带来了问题。这些算法在最新的Sun 公司的编译器和Borland 5.1上已经测试过,但在微软公司的C++ 6.0版本上存在些问题。通常,查阅厂商的文档可以比较轻松地解决这些问题。







