我们常用到的STL容器有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我们了解清楚。

verctor

vector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。此外,当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。

list

list类似于C语言中的双向链表,它通过指针来进行数据的访问,因此维护的内存空间可以不连续,这也非常有利于数据的随机存取,因而它没有提供 [] 操作符重载。

deque

deque类似于C语言中的双向队列,即两端都可以插入或者删除的队列。queue支持 [] 操作符,也就是支持随机存取,而且跟vector的效率相差无几。它支持两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率 也差不多。或者我们可以这么认为,deque是vector跟list的折中。

map

map类似于数据库中的1:1关系,它是一种关联容器,提供一对一(C++ primer中文版中将第一个译为键,每个键只能在map中出现一次,第二个被译为该键对应的值)的数据处理能力,这种特性了使得map类似于数据结构里的红黑二叉树。

multimap

multimap类似于数据库中的1:N关系,它是一种关联容器,提供一对多的数据处理能力。

set

set类似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。

multiset

multiset类似于数学里面的集合,集合中可以包含重复的元素。

小结

在实际使用过程中,到底选择这几种容器中的哪一个,应该根据遵循以下原则:

1、如果需要高效的随机存取,不在乎插入和删除的效率,使用vector;

2、如果需要大量的插入和删除元素,不关心随机存取的效率,使用list;

3、如果需要随机存取,并且关心两端数据的插入和删除效率,使用deque;

4、如果打算存储数据字典,并且要求方便地根据key找到value,一对一的情况使用map,一对多的情况使用multimap;

5、如果打算查找一个元素是否存在于某集合中,唯一存在的情况使用set,不唯一存在的情况使用multiset。

原文转自 http://blog.csdn.net/yyme411/article/details/38182495

最新文章

  1. iOS开发系列--地图与定位
  2. .NET DateTime类型变量作为参数时设置默认值
  3. .net 环境下get 获取页面出现乱码问题解决
  4. html5 placeholder ie 不兼容问题 解决方案
  5. android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论
  6. oracle学习
  7. Touch组件实现原理
  8. String构造函数originalValue.length>size 它发生
  9. 防暴力破解 Fail2Ban之python
  10. 【转】RestQL:现代化的 API 开发方式
  11. IT行业歧视40岁以上人群为找工作还要谎报年龄[转]
  12. D的下L
  13. ASP.NET WebAPI构建API接口服务实战演练
  14. hexo + Github Page 0元建立博客攻略
  15. Squid 搭建正向代理服务器
  16. bzoj千题计划188:bzoj1923: [Sdoi2010]外星千足虫 (高斯—若尔当消元法解异或方程组)
  17. uboot下emmc内容烧写(拷贝)步骤
  18. xcode开启后,每次调试运行要输入密码
  19. Android签名生成和互转
  20. Python爬虫教程-32-Scrapy 爬虫框架项目 Settings.py 介绍

热门文章

  1. java util - Hex转换工具
  2. 免费证书Let’s Encrypt
  3. while循环中continue和break的区别
  4. dijkstra与他的优化!!!
  5. hadoop 启动or运行mr错误
  6. Java面向对象---面向对象
  7. mysql之面试问题总结
  8. fetch 使用记录
  9. leetcode 【 Pascal's Triangle 】python 实现
  10. 嵌入式之download