Effective STL中文版:50条有效使用STL的经验 - (EPUB全文下载)
文件大小:0.18 mb。
文件格式:epub 格式。
书籍内容:
Effective STL中文版:50条有效使用STL的经验
1 容器
2 vector和string
3 关联容器
4 迭代器
5 算法
6 函数子、函数子类、函数及其他
7 在程序中使用STL
参考书目
附录A 地域性与忽略大小写的字符串比较
附录B 对Microsoft的STL平台的说明
后折页
封底
1 容器
没错,STL中有迭代器(iterator)、算法(algorithm)和函数对象(function object),但是对于大多数C++程序员来说,最值得注意的还是容器。容器比数组功能更强大、更灵活。它们可以动态增长(和缩减),可以自己管理内存,可以记住自己包含了多少对象。它们限定了自己所支持的操作的复杂性。诸如此类的优点还有很多。不难理解它们为何如此受欢迎,因为相对于其竞争者,无论是来自其他库中的容器还是你自己编写的容器,其优越性是显而易见的。STL容器不是简单的好,而是确实很好。
本章讲述适用于所有STL容器的准则。随后几章将就特定类型的容器展开论述。本章内容包括:如何就你所面临的具体制约条件选择适当的容器类型;避免一种错误认识,即为一种类型的容器而编写的代码换了其他容器也能工作;对于容器中的对象,复制操作的重要性;当指针或者auto_ptr被存放在容器中时会有什么样的困难;删除操作的细节;用定制的分配子能做什么及不能做什么;使程序获得最高效率的窍门;以及在多线程环境中使用容器时的一些考虑。
涉及的方方面面很多。别着急,饭要一口一口地吃。这些问题将分为几条,逐条下来,你一定会形成一些想法,并将这些想法应用到你正在编写的代码中。
第1条:慎重选择容器类型。
C++提供了几种不同的容器供你选择,可是你有没有意识到它们的不同点在哪里?为了防止你在选择时有所疏忽,这里给出了简要回顾:
■ 标准STL序列容器:vector、string、deque和list。
■ 标准STL关联容器:set、multiset、map和multimap。
■ 非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个“重型”string。(“rope”是重型“string”,明白了吗?)你可以在第50条中找到对这些非标准(但通常可以使用)的容器的一个简要介绍。
■ 非标准的关联容器hash_set、hash_multiset、hash_map和hash_multimap。在第25条中,我分析了这些基于哈希表的、标准关联容器的变体(它们通常是广泛可用的)。
■ vector
■ vector作为标准关联容器的替代。正如第23条中所阐明的,有时vector在运行时间和空间上都要优于标准关联容器。
■ 几种标准的非STL容器,包括数组、bitset、valarray、stack、queue和priority_queue。因为它们不是STL容器,所以在本书中很少提及,仅在第16条中提到了一种“数组优于STL容器”的情形,以及在第18条中解释了为什么bitset比vector
可以做出的选择是很多的,选择的多样性意味着在做选择时要考虑多种因素。不幸的是,大多数关于STL的讨论对于容器的世界涉及很浅,在“如何选择最合适的容器”这一问题上忽略了很多因素。即便是C++标准也是如此。C++标准就“如何在vector、deque和list中做出选择”提供了如下建议:
vector、list和deque为程序员提供了不同的复杂性,使用时要对此做出权衡。vector是默认应使用的序列类型;当需要频繁地在序列中间做插入和删除操作时,应使用list;当大多数插入和删除操作发生在序列的头部和尾部时,deque是应考虑的数据结构。
如果算法复杂性是主要的考虑因素,我认为以上的建议是恰当的,但除此之外需要考虑的还有很多。
稍后我们将讨论与算法复杂性相对应的有关容器的重要问题。但首先我要引入对STL容器的一种分类方法,该方法没有得到应有的重视。这就是对连续内存容器(contiguous-memory container)和基于节点的容器(node-based container)的区分。
连续内存容器(也称为基于数组的容器,array-based container)把它的元素存放在一块或多块(动态分配的)内存中,每块内存中存有多个元素。当有新元素插入或已有的元素被删除时,同一内存块中的其他元素要向前或向后移动,以便为新元素让出空间,或者填充被删除元素所留下的空隙。这种移动影响到效率(参见第5条、第14条)和异常安全性(我们很快将会看到这一点)。标准的连续内存容器有vector、string和deque。非标准的rope也是一个连续内存容器。
基于节点的容器在每一个(动态分配的)内存块中只存放一个元素。容器中元素的插入或删除只影响到指向节点的指针,而不影响节点本身的内容,所以当有插入或删除操作时,元素的值不需要移动。表示链表的容器,如list和slist,是基于节点的;所有标准的关联容器也是如此(通常的实现方式是平衡树)。非标准的哈希容器使用不同的基于节点的实现,在第25条将会看到这一点。
有以上这些术语作为基础,我们将概括出选择容器时最重要的一些问题。在接下来的讨论中,我将不考虑非STL容器(如数组、bitset等),因为本书毕竟是一本关于STL的书。
■ 你是否需要在容器的任意位置插入新元素?如果需要,就选择序列容器;关联容器是不行的。
■ 你是否关心容器中的元素是排序的?如果不关心,则哈希容器是一个可行的选择方案;否则,你要避免哈希容器。
■ 你选择的容器必须是标准C++的一部分吗?如果必须是,就排除了哈希容器、slist和rope。
■ 你需要哪种类型的迭代器?如果它们必须是随机访问迭代器,则对容器的选择就被限定为vector、deque和strin ............
以上为书籍内容预览,如需阅读全文内容请下载EPUB源文件,祝您阅读愉快。
书云 Open E-Library » Effective STL中文版:50条有效使用STL的经验 - (EPUB全文下载)