STL 容器区别:vector、list、deque、set、map的底层实现

1、set和map

比较

\ set map
共同点 都是无序的保存元素,只是通过它提供的借口对里面的元素进行访问,底层都是采用红黑树实现
不同点 集合,用来判断某一个元素是不是在一个组里面,使用的比较少 映射,相当于字典,把一个值映射成另一个值,可以创建字典
总结:

a. 优点

查找某一个数的时间为O(logn)
遍历时采用iterator,效果不错
b. 缺点

每次插入值的时候,都需要调整红黑树,效率有一定影响
2、vector

概述

是动态数组,在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放;如果新值大于当前大小时才会重新分配内存。
特点

拥有一段连续的内存空间,并且起始地址不变,因此能够非常好的支持随机存取,即[]操作符,但是由于它的内存空间是连续的,所以在头部和中间进行插入和删除操作会造成内存块的拷贝,另外,当该数组的内存空间不够时,需要重新申请一块足够大得内存并且进行内存的拷贝,这些都大大的影响了vector的效率。
对头部和中间进行添加删除元素操作需要移动内存,如果你得元素是结构或类,那么移动的同时还会进行构造和析构操作,所以性能不高
对任何元素的访问时间都是O(1),所以常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作
属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存,如push_back 1000个元素,capacity返回值为16384
对最后元素操作最快(在后面添加删除元素最快),此时一般不需要移动内存,只有保留内存不够时才需要
总结

需要经常随机访问且不用经常对中间元素删除插入时使用vector
如果元素是结构或类,最好是将结构或类的指针放入vector中,这样不仅能够节省空间,而且可以避免移动时构造和析构操作
删除元素时采用后面的元素覆盖前面的元素的方法可以提高效率

3、list

概述

双向链表,元素也存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供[]操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的删除和插入操作。
特点

没有空间预留习惯,所以没分配一个元素都会从内存中分配,没删除一个元素都会释放它占用的内存
在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机插入和删除操作容器
访问开始和最后两个元素最快,其他元素的访问时间都是O(n)
总结

如果经常进行添加和删除操作并且不经常随机访问的话,使用list
list<指针>完全是性能最低的做法,还不如直接使用list<对象>或使用vector<指针>好,因为指针没有构造与析构,也不占用很大内存

4、deque

概述

【堆1】

【堆2】

【堆3】

特点

支持[]操作符,也就是支持随机存取,有比较搞的随机存取速度,由于deque需要处理内部跳转,因此速度上没有vector快
\ deque vector
组织方式 按页或块来分配存储器的,每页包含固定数目的元素 分配一段连续的内存来存储内容
效率 即使在容器的前端也可以提供常数时间的insert和erase操作,而且在体积增长方面也比vector更具有效率 只是在序列的尾端插入元素时才有效率,但是随机访问速度要比deque快
支持两端操作push_back、push_front、pop_back、pop_front等,并且效率与list差不多

总结

如果既需要随机存取,又需要两端数据插入和删除,则应该使用deque

5、总结

\ vector ist deque
特点 快速的随机存取,快速的在最后插入删除元素 可以快速的在任意位置添加删除元素,只能快速的访问最开始和最后面的元素 在开始和最后添加删除元素一样快,并且提供了随机访问的方法
适用 需要高效的随机存取,不在于插入删除的效率 需要大量的插入和删除操作,不关心随机存取 需要随机存取,也需要高效的在两端进行插入删除操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值