序列容器
2016-04-22 00:00
162 查看
1、序列容器
(1)vector
vector和built-in数组类似,拥有一段连续的内存空间,能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝。另外,当插入较多的元素后,预留内存空间可能不够,需要重新申请一块足够大的内存并把原来的数据拷贝到新的内存空间。这些影响了vector的效率,但是实际上用的最多的还是vector容器,建议大多数时候使用vector效率一般是不错的。
(2)list
list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。(3)deque
deque是一个double-ended queue,它的具体实现不太清楚,但知道它具有以下两个特点:它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。2、特点
(1)vector
优点:随机存取,即[]操作和vector.at()
动态操作,push_back()与pop_back()
自动调整内存,节省空间
缺点:
实现插入与删除操作效率低
只能在尾部插入与删除,在头部插入与删除消耗时间规模与容器大小成正比。
当动态添加的数据超过默认内存大小时,要进行整体的重新分配,拷贝与释放。
(2)list
优点:内存不连续
动态操作,插入与删除效率高
可在两端进行pop,push
缺点:
不能随机访问
相对于vector占用内存多
(3)deque
优点:随机访问,即[]操作和deque.at()
插入与删除方便
可在双端进行pop,push
缺点:
占用内存多。
3、联系区别
(1)联系
三者都能实现resize()来重新调整容器的大小。(2)区别
1)vector能实现随即存取,即[]操作,而list不能,deque是二者的结合体,也能够实现索引操作[],但效率没有vector高。2)vector适合在文件的末尾实现删除元素的操作pop_back()与插入操作push_back(),在中间时效率非常低下。而list可以在容器的任何位置实现插入与删除操作。
原因:vector的元素地址连续,如果在中间插入与删除操作,可能会导致原来的内存地址不足以存储当前的元素,需要重新分配内存地址,这就需要将原来的所有元素拷贝到新内存,释放旧的内存地址等操作,操作代价高昂。而list元素内存地址不连续,用指针操作,其本身是一个双向链表,它的高效率体现在插入,删除以及排序等移动大量元素的操作。
4、选择容器类型的准则
1. 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector2. 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3. 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
相关文章推荐
- Stack容器
- Queue容器
- 天下数据总结高频率结算电子商务解决方案
- KeyMob移动广告聚合平台-开发者收益飞起来
- KeyMob提供最佳的广告管理服务
- KeyMob移动广告聚合平台是一家为开发者和广告管理服务平台
- KeyMob聚合-为国内广大开发者一族提供免费广告管理服务
- KeyMob聚合致力于为广大开发者及广告聚合服务
- 注册报名:迈向云之路-F5 Agility China 2016
- mysql 优化实例(百万级数据)
- forClass
- 大公司在github的开源代码
- Extjs核心概念之Store
- 创业的第一百七十一天
- vsftp上传问题(错误533)解决
- SSH登录很慢问题的解决方法
- Android开发之-tabHost-1
- 怎么不说糟糕的javaer?java开发者的水平都很高?国内真正懂java的不超过10个
- 编译可在Android上运行的gettext库
- java编程思想学习笔记——File类