Effective STL学习笔记-条款1

来源:互联网 发布:手机照片阅读软件 编辑:程序博客网 时间:2024/06/14 02:34

前言

学习这本书之前,首先我们需要明确,这本书能学到很多很多关于STL、关于模板编程的书。但是有一些部分,一些C++11加入的东西,例如新的容器unordered_map,或者匿名函数(lambda表达式),function等等。
在学习这本书的时候,我会结合c++一些新特性,对比学习(^__^) 嘻嘻……。

条款1 仔细的选择你的容器

仔细的选择你的容器

总结书上的:
●你需要“可以在容器的任意位置插入一个新元素”的能力吗? 如果是,你需要序列容器,关联容器做
不到。
● 你关心元素在容器中的顺序吗? 如果不,散列容器就是可行的选择。否则,你要避免使用散列容器。
● 必须使用标准C++中的容器吗? 如果是,就可以除去散列容器、slist和rope。
● 你需要哪一类迭代器?如果必须是随机访问迭代器,在技术上你就只能限于vector、deque和string,但
你也可能会考虑rope(关于rope的更多信息在条款50)。如果需要双向迭代器,你就用不了slist(参见条款50)和散列容器的一般实现(参见条款25)。
● 当插入或者删除数据时,是否非常在意容器内现有元素的移动? 如果是,你就必须放弃连续内存容器(参见条款5)。
● 容器中的数据的内存布局需要兼容C吗? 如果是,你就只能用vector(参见条款16)。
● 查找速度很重要吗? 如果是,你就应该看看散列容器(参见条款25),排序的vector(参见条款23)和标准的关联容器——大概是这个顺序。
● 你介意如果容器的底层使用了引用计数吗? 如果是,你就得避开string,因为很多string的实现是用引用计数(参见条款13)。你也不能用rope,因为权威的rope实现是基于引用计数的(参见条款50)。
于是你得重新审核你的string,你可以考虑使用vector。
● 你需要插入和删除的事务性语义吗? 也就是说,你需要有可靠地回退插入和删除的能力吗?如果是,你就需要使用基于节点的容器。如果你需要多元素插入(比如,以范围的方式——参见条款5)的事务性语义,你就应该选择list,因为list是唯一提供多元素插入事务性语义的标准容器。事务性语义对于有兴趣写异常安全代码的程序员来说非常重要。(事务性语义也可以在连续内存容器上实现,但会有一个性能开销,而且代码不那么直观。要了解这方面的知识,请参考Sutter的《Exceptional C++》的
条款17[8]。)
● 你要把迭代器、指针和引用的失效次数减到最少吗? 如果是,你就应该使用基于节点的容器,因为在这些容器上进行插入和删除不会使迭代器、指针和引用失效(除非它们指向你删除的元素)。一般来说,在连续内存容器上插入和删除会使所有指向容器的迭代器、指针和引用失效。
● 你需要具有有以下特性的序列容器吗:1)可以使用随机访问迭代器;2)只要没有删除而且插入只发生在容器结尾,指针和引用的数据就不会失效? 这个一个非常特殊的情况,但如果你遇到这种情况,deque就是你梦想的容器。(有趣的是,当插入只在容器结尾时,deque的迭代器也可能会失效,deque是唯一一个“在迭代器失效时不会使它的指针和引用失效”的标准STL容器。)

以上部分不包括C++11新引入的一些容器,下面介绍一下:

  • std::unordered_set
    无序集是一个关联容器,它包含一组类型为Key的唯一对象。搜索,插入和删除具有平均的恒定时间复杂度。
    在内部,元素不按任何特定的顺序进行排序,但被组织成桶。元素被放置在哪一个桶完全取决于其值的哈希值。这允许快速访问各个元素,因为一旦计算了一个散列,它就是指元素被放入的确切的存储桶。
    容器元素可能不被修改(即使是非常量迭代器),因为修改可以改变元素的散列并损坏容器。

  • std::unordered_mulitset
    序多集是一个关联容器,它包含一组可能非唯一的类型为Key的对象。搜索,插入和删除具有平均的恒定时间复杂度。
    在内部,元素不按任何特定的顺序进行排序,但被组织成桶。元素被放置在哪一个桶完全取决于其值的哈希值。这允许快速访问单个元素,因为一旦计算了散列,它就是指元素被放入的确切的存储桶。
    此容器的迭代顺序是稳定的

  • std::unordered_map
    无序映射是包含具有唯一键的键值对的关联容器。元素的搜索,插入和删除具有平均的恒定时间复杂性。
    在内部,元素不按任何特定的顺序进行排序,但被组织成桶。放入元素的哪个桶完全取决于其键的散列。这允许快速访问各个元素,因为一旦计算了散列,它就是指元素被放入的确切存储桶

  • std::unordered_multimap
    无序Multimap是一个无序的关联容器,支持等效的键(一个unordered_multimap可能包含每个键值的多个副本),并将另一个类型的值与键相关联。unordered_multimap类支持前向迭代器。搜索,插入和删除具有平均的恒定时间复杂度。
    在内部,元素不按任何特定的顺序进行排序,但被组织成桶。放入元素的哪个桶完全取决于其键的散列。这允许快速访问单个元素,因为一旦计算了散列,它就是指元素被放入的确切的存储桶。
    此容器的迭代顺序是稳定的

原创粉丝点击