Effective STL 读书笔记——第1条 慎重选择容器类型

STL中有迭代器(iterator),算法(algorithm)和函数对象(function object)。其中最值得注意的可能还是容器。容器相比数组更加灵活,它们可以动态增长(和缩减),自己管理内存,可以记住自己包含了多少对象。


STL容器不是简单的好,而是确实很好。


在第1条款中,我们将简要介绍下各个容器的特点以及他们特定的使用场景。

首先简要回顾下c++提供的几种容器:

  • 标准 STL 序列容器:vector, string, deque, list
  • 标准 STL 关联容器:set, multiset, map, multimap
  • 非标准序列容器 slist 和 rope
  • 非标准关联容器 hash_set, hash_multiset, hash_map, hash_multimap
  • vector<char>作为 string 的替代
  • vector作为标准关联容器的替代
  • 几种标准的非STL容器,包括数组 、bitset、stack、queue等。


对STL容器的一种重要的分类方法,即对连续内存容器基于节点容器的区分。

  • 连续内存分配(也称基于数组的容器)把它的元素放在一块或者多块(动态分配的)内存中,每块内存中都有多个元素。当有新元素插入或已存在的元素删除时,同一块中的其他元素要向前或者向后移动。这种移动影响到效率和异常安全性。其中容器vector, string, deque都属于此类。
  • 基于节点的容器在每一个(动态分配的)内存块中只存放一个元素。容器中元素的插入和删除只影响到指向节点的指针,而不影响节点本身的内容,当有元素插入或者删除时,元素的值不需要移动。其中容器list,和所有标准的关联容器(通常实现方式是平衡树)都属于此类。


选择容器时,我们经常会有以下考虑:

  • 是否需要在容器的任意位置插入新元素?  需要就选择序列容器,关联容器是做不到的。
  • 是否关心容器中的元素是排序的? 不关心的话,那么哈希容器可行,否则应该避免哈希容器。
  • 需要的迭代器类型?  如果必须是随机访问迭代器,那么只能选择vector, deque, string。
  • 当有元素插入或者删除时,避免移动容器中原有元素是否重要? 如果是,那就要避免使用连续内存的容器。
  • 元素的查找是否是关键的考虑因素? 如果是,则考虑哈希容器、排序的vector、标准关联容器
  • 等等等

上面这些并没有覆盖所有的情形。总之在选择容器时,除了容器操作的算法复杂性,还有很多需要考虑的因素。也不存在“默认的容器”。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值