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

来源:互联网 发布:阿里云客服报名入口 编辑:程序博客网 时间:2024/05/29 16:28

容器

分类:
标准STL序列容器:vector、string、deque 和list。
标准STL关联容器:set、multiset、map 和multimap。
非标准序列容器:slist和rope。
非标准关联容器:hash_set、hash_multiset、hash_map和hash_multimap。
标准非STL容器:数组、bitset、valarray、queue和priority_queue。


分类:
连续内存容器(也叫做基于数组的容器):在一个或多个(动态分配)的内存块中保存它们的元素。如果一个新元素被插入或删除已存在的元素,其他在同一个内存块的元素必须移动来腾出空间或是填充空间。影响效率和异常安全。
包括有:vector、string 和deque; rope

基于节点的容器:在每个内存块(动态分配)中只保存一个元素。元素的插入和删除只影响指针不影响内容,其他元素之不需要移动。
包括:list、slist 、set 、multiset 、map 、multimap
而非标准的散列容器使用不同的基于节点的实现


关于容器的选择问题:

  • vector、list和deque之间的选择,vector可以作为一种默认使用的序列类型,当需要频繁对序列中部进行插入、删除操作是用list,当大部分的插入和删除发生在序列的头部或尾部是用deque。
  • 需要在容器任意位置插入一个新元素,则选用序列容器。
  • 需要考虑容器中元素的顺序时,应该避免使用散列容器。
    插注:
    五种迭代器:
    输入迭代器和输出迭代器;
    前向迭代器:所有标准STL容器都支持比前向迭代器更强大的迭代器;
    双向迭代器:标准关联容器都提供双向迭代器,list也有。
    随机访问迭代器:vector、string和deque都提供随机访问迭代器。指向数组的指针也可以作为数组的随机访问迭代器。
  • 如果容器中的数据的内存布局需要兼容C,则只能用vector。
  • 重视查找速度的话,容器的选择的优先级别应该是:散列容器>排序的vector>标准关联容器。
  • 很多string的实现以及rope的实现是基于引用计数的。可以用vector代替string。
  • 是否需要插入和删除的事务性语义。也就是是否需要可靠地回退插入和删除的能力,如果是,应选用基于节点的容器。如果需要多元素插入,选用list。
  • 是否需要考虑把迭代器、指针和引用的失效次数减少到最低。如果是,应使用基于节点的容器,因为只要不指向你要删除的元素,在这些容器上插入和删除不会使迭代器、指针和引用失效。
  • 当需要满足以下特性时:1)可以使用随机访问迭代器;2)只要没有删除而且插入只发生在容器结尾,指针和引用(这里,迭代器可能会失效,但是deque是唯一一个“在迭代器失效时不会使它的指针和引用失效”的标准STL容器)的数据就不会失效。应该选用deque。

—————————-整理自《Effective STL》

原创粉丝点击