顺序容器性能比较

本博客内容来源与C++primer以及STL源码解析。学习顺序容器最重要的是了解每种容器的结构原理进而在实际应用中选择最合适的容器。

顺序容器类型介绍

vector/string:可变大小,可添加和删除元素,在尾部以外的位置添加和删除元素的很慢,随机访问很快(下标),but string专门存放字符。

vector因为存储在堆上,所以支持erase(), resieze()(重新划分容器容量)等操作;vector不用担心越界当空间不够用的时候,系统会自动按照一定的比例(对capacity()大小)进行扩充。在vector序列末尾添加(push_back())或者删除(pop_back())对象效率高,在中间进行插入或删除效率很低,主要是要进行元素的移动和内存的拷贝,原因就在于当内存不够用的时候要执行重新分配内存,拷贝对象到新存储区,销毁old对象,释放内存等操作,如果对象很多的话,这种操作代价是相当高的。为了减少这种代价,使用vector最理想的情况就是事先知道所要装入的对象数目,用成员函式 reserve( ) 预定下来;vector最大的优点莫过于是检索(用operator[])速度在这三个容器中是最快的。

array:元素保存在连续的内存中,固定大小,快速随机访问,but不能添加和删除元素 && 不能更改容器大小。

list/forward_list:双向链表/ 单向链表,forward_list没有size操作。内存空间不连续,通过指针进行操作。解决vector和string不能再任意位置添加和删除元素的弊端,but不支持随即快速访问(遍历整个容器),额外内存开销也很大(相比vector/string)。

deque:双端队列,快速随机访问,在两端添加或删除元素很快,but 在其他位置的insert和delete操作将会很慢。queue是由多个连续内存块构成,deque是list和vector的兼容,分为多个块,每一个块大小是512字节,块通过map块管理,map块里保存每个块得首地址。因此该容器也有索引操作operator[ ],效率没vector高。另外,deque比vector多了push_front( ) & pop_front( )操作。在两端进行此操作时与list的效率 差不多。

根据上面简单的介绍,我们知道了这几种典型的容器的优缺点,在使用过程中可根据这个优缺点选择容器,达到快速处理数据的目的。

说实话,一般都会选择使用vector,但是如果你真的真的不知道使用哪种容器时,你可以在使用过程中选择是否使用下标访问。比如,在vector和list之间选择时,可以在使用过程中采用他们的公共操作:迭代器(iterator),不使用下标访问,避免随机访问。
下面是选择顺序容器类型的一些准则
1. 如果我们需要随机访问一个容器则vector要比list好得多
2. 如果我们已知要存储元素的个数则vector 又是一个比list好的选择。
3. 如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好
4. 除非我们需要在容器首部插入和删除元素否则vector要比deque好
5. 如果只在容易的首部和尾部插入数据元素,则选择deque
6. 如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑输入时将元素读入到一个List容器,接着对此容器重新拍学,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器中

所有容器的操作(顺序、关联、无序)

1.类型别名

iterator  此容器类型的迭代器类型
const_iterator 可以读取元素,但不能修改元素的迭代器类型,类似于const的用法
size_type 无符号整数类型,保存此容器的最大可能大小
di
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值