大家知道,c++的STL标准库很好用,里面的vector,list,deque,stack,slist,set,map,都很好用。但是,在实际编程过程中,如何根据自己的项目需求选择里面的一种容器呢?

    最好的办法就是了解其中的原理,然后做选择。(补充,如果项目中不考虑效率,就不用考虑那么多了~毕竟STL从头到尾都考虑了效率问题。)


vector

vector的基本原理如下:

它采用线性空间存储数据。如果空间不够,则另外分配新的两倍大小的空间,然后把旧空间释放掉。

可以看出:

①vector不适合push_front(效率很低)

②vector不适合中间插入删除操作。中间插入删除操作会引起内存拷贝。


list

list的原理如下:

list采用非线性的空间存储数据。

①list适合插入删除频繁的场所。不管插入还是删除,时间基本上都是常数。

②list不适合随机线性访问。


deque

deque基本原理:

deque采用类似文件系统的方式存储数据。其中有数个连续空间的缓冲区存储数据。这些缓冲区连接起来,给上层用户一个假象就是,存储的数据空间是连续的。

deque是list和vector的折中方案。兼有list的优点,也有vector随机线性访问效率高的优点。

①deque仍旧不适合中间插入删除操作。

②deque适合线性随机访问数据。


stack

stack是deque的一种变种,优缺点不变。

queue(队列)

queue是deque的一种变种,优缺点不变。

heap

heap的实现原理如图:




heap容器采用二叉树存储数据。所以heap容器适合经常排序的场所。heap容器里的数据是自动排序的~
















如何选择STL容器?相关推荐

  1. 标准非STL容器 : bitset

    1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...

  2. STL容器底层数据结构的实现

    C++ STL 的实现: 1.vector      底层数据结构为数组 ,支持快速随机访问 2.list            底层数据结构为双向链表,支持快速增删 3.deque       底层 ...

  3. 海量数据处理算法 各种STL容器使用的数据结构剖析

    教你如何迅速秒杀掉:99%的海量数据处理面试题 转载于:结构之法算法之道blog 前言 一般而言,标题含有"秒杀","99%","史上最全/最强&qu ...

  4. c++之STl容器-string

    目录 容器的分类 string string的概念 string的初始化 string的遍历 string的一些基本操作 char*类型和string类型互转 字符串的连接 字符串的查找和替换 str ...

  5. 5.1 c++ STL 容器适配器简介

    1. 适配器简介 在详解什么是容器适配器之前,初学者首先要理解适配器的含义. 其实,容器适配器中的"适配器",和生活中常见的电源适配器中"适配器"的含义非常接近 ...

  6. C++常用STL容器

    C++常用STL容器 vector 向量容器 二维数组指针.二维向量 pair 对 list 双向列表 map 表 unordered_map 哈希表 set 集合 unordered_set 哈希集 ...

  7. STL容器比较和基本操作

    stl不同容器的优缺点 verctor vector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以 ...

  8. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  9. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请 ...

最新文章

  1. 建库、建表、建约束、插入测试数据
  2. C#中判断系统的网络连接状态的方法
  3. 单独运行shell脚本与crontab运行shell脚本的区别
  4. Android WebView与JavaScript交互详解
  5. Plain text, flat file, 及flat-file database 如何翻译
  6. 与大家分享一下2010我的找工作历程!真累啊!不过都已经结束了!
  7. node.js打包环境部署CentOS7.4
  8. Postman怎么用?
  9. cocos2d-x android游戏使用自己的字体
  10. QTouch手机组态软件APP
  11. minist数据集的获取方法
  12. Redis-事务(集成SpringBoot工程)
  13. 《阿尔比恩的种子》pdf、mobi、epub
  14. windows下Python2.7 的 pyOpenGL模块安装
  15. 辉芒微IO单片机FT60F023-RB方案MCU开发
  16. XUPT_ACM2021寒假训练第一周练习记录
  17. 前端:使用BootStrap搭建一个简单的网页
  18. 倍福--ip地址修改
  19. 机器学习(十八)应用实例:照片OCR
  20. ReentrantLock

热门文章

  1. error : unterminated argument list invoking macro
  2. 数字电路技术基础(三)
  3. 通过HttpURLConnection连接上传文件和参数
  4. 机器学习中的特征空间
  5. 【毕业设计_课程设计】基于神经网络学习的在线纸币识别【源码+论文】
  6. C# .Net 使用多个Dbcontext
  7. IOS gif图片播放 swift
  8. 活着——活着就是对生命最好的尊重
  9. 超市服务器操作系统,超市收银系统 服务器 配置
  10. 10004 - Bicoloring