容器的选用

分配连续存储元素的内存空间会影响内存分配策略和容器对象的开销,通过巧妙的实现技巧,标准库的实现者已经最小化了内存分配的作用。元素是否连续存储还会显著地影响:

1)在容器的中间位置添加或删除元素的代价。

2)执行容器元素的随机访问的代价。

程序使用这些操作的程度将决定应该选择哪种类型的容器。vector和deque容器提供了对元素的快速随机访问,但付出的代价是在容器的任意位置插入或删除元素,比在容器尾部插入和删除的开销更大。list类型在任何位置都能快速插入和删除,但付出的代价是元素的随机访问开销较大。

1、插入操作如何影响容器的选择

list容器表示不连续的内存区域,允许向前和向后逐个遍历元素。在任何位置都可以高效地insert或erase一个元素。插入或删除list容器中的一个元素不需要移动任何其他元素。另一方面,list容器不支持随机访问,访问某个元素要求遍历所涉及的其他元素。

对于vector容器,除了容器尾部外,其他任何位置上的插入(或删除)操作都要求移动被插入(或删除)元素右边所有的元素。例如假设有一个拥有50个元素的vector容器,我们希望删除其中的第23号元素,则23号元素后面的所有元素都必须向前移动一个位置。否则vector容器上将会留下一个空位(hole),而vector容器的元素就不再是连续存放的了。

deque容器拥有更加复杂的数据结构。从deque队列的两端插入或删除元素都非常快。在容器中间插入或删除付出的代价将更高。deque容器同时提供了list和vector的一些性质:

  • 与vector容器一样,在deque容器的中间insert或erase元素效率比较低。
  • 不同于vector容器,deque容器提供高效地再其首部实现insert和erase的操作,就像在容器尾部的一样。
  • 与vector容器一样而不同于list容器的是,deque容器支持对所有元素的随机访问。
  • 在deque容器首部或尾部插入元素不会使任何迭代器失效,而在首部或尾部删除元素则只会使指向被删除元素的迭代器失效。在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器都失效。

2、元素的访问如何影响容器的选择

vector和deque容器都支持对其元素实现高效的随机访问。也就是说,我们可以高效地先访问5号元素,然后访问15号元素,接着访问7号元素,等等。由于vector容器的每次访问都是距离其起点的固定偏移,因此其随机访问非常有效率。在list容器中,上述跳跃访问会变得慢很多。在list容器的元素之间移动的唯一方法是顺序跟随指针。从5号元素移动到15号元素必须遍历它们之间所有的元素。

3、容器类型的选择法则:

  • 如果程序要求随机访问元素,则应使用vector或deque容器。
  • 如果程序必须在容器的中间位置插入或删除元素,则应采用list容器。
  • 如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用deque容器。
  • 如果只需在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可以考虑在输入时将元素读入到一个list容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器。

注意:如果无法确定某种应用应该采用那种容器,则编写代码时尝试只使用vector和list容器都提供的操作:使用迭代器,而不是下标,并且避免随机访问元素。这样编写代码,在必要时,可很方便地将程序充使用vector容器修改为使用list容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值