1. 各个容器之间区别

① vector 
  (连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间岁间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,然后拷贝的性能开销。

② deque 
  (小片的连续,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是可以使用[],只是速度没有vector快)快速的访问随机的元素,快速的在开始和末尾插入元素,随机的插入,删除元素要慢,空间的重新分配要比vector快,重新分配空间后,原有的元素不需要拷贝。对deque的排序操作,可将deque先复制到vector,排序后在复制回deque。

③ list 
  (每个元素间用链表相连)访问随机元素不如vector快,随机的插入元素比vector快,对每个元素分配空间,所以不存在空间不够,重新分配的情况

④ set 
  内部元素唯一,用一棵平衡树结构来存储,因此遍历的时候就排序了,查找也比较快的哦。 
⑤ map 
  一对一的映射的结合,key不能重复。 
⑥ stack 
  适配器,必须结合其他的容器使用,stl中默认的内部容器是deque。先进后出,只有一个出口,不允许遍历。 
⑦ queue 
  是受限制的deque,内部容器一般使用list较简单。先进先出,不允许遍历。

2. vector、deque和list选择准则

  vector、deque和list都是动态增长的,选择标准主要是关注插入特性以及对元素的后续访问要求。 
  1) vector: 连续的内存区域,随机访问效率高,插入删除效率低。Vector并不是随每一个元素的插入而增长自己,而是当vector需要增长自身时,它实际分配的空间比当前所需的空间要多一些,也就是说,它分配了一些额外的内存容量,或者说他预留了这些存储区(分配的额外容量的确切数目由具体实现定义)。实际上,对于小的对象,vector在实践中比list效率更高。 
  vector的动态自我增长越频繁,元素插入的开销就越大。两种解决方案: 
  a) 当vector开销变大时,把vector转换成list. 
  b) 更常用的方案时,通过指针间接存储复杂的类对象。首先,容量从1增加到256,重新分配的次数大大减少。其次,指向类对象的指针的拷贝和释放不需要调用该类的拷贝构造函数和析构函数。 
  2) list: 非连续的内存区域,并通过一对指向首尾元素的指针双向联结起来,从而允许向前向后两个方向进行遍历。插入和删除效率高,随机访问支持不好。 
  3) deque: 也表示一段连续的内存区域,支持高效在首部插入和删除元素,通过两级数据结构来实现,一级表示实际的容器,第二级指向容器的首和尾。如果容器的主要行为是在前段插入元素,则deque比vector效率高。 
   
 下面是选择顺序容器类型的一些准则 
  1.如果我们需要随机访问一个容器则vector要比list好得多 。 
  2.如果我们已知要存储元素的个数则vector 又是一个比list好的选择。 
  3.如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好 。 
  4.除非我们需要在容器首部插入和删除元素否则vector要比deque好。 
  5.如果只在容易的首部和尾部插入数据元素,则选择deque。 
  6.如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑输入时将元素读入到一个List容器,接着对此容器重新拍学,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器中。

3. 链表与数组区别

  链表和数组一样是一种数据结构,如何使用完全基于你的应用需求。 
  链表和C++语言本身没有任何联系。很多语言都可以实现链表数据结构。 
  我讲一下数据和链表的区别有可能帮助你对链表的使用有个感觉。 
  数组是将元素在内存中连续存放,由于每个元素占用内存相同,所以你可以通过下标迅速访问数组中任何元素。但是如果你要在数组中增加一个元素,你需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果你想删除一个元素,你同样需要移动大量元素去填掉被移动的元素。 
  链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果你要访问链表中一个元素,你需要从第一个元素开始,一直找到你需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了, 只要修改元素中的指针就可以了。 
  从上面的比较你可以看出,如果你的应用需要快速访问数据,很少或不插入和删除元素,你就应该用数组;相反, 如果你的应用需要经常插入和删除元素你就需要用链表数据结构了。然后你自己可以想一想什么样的应用用链表合适。

C++中数组、链表list、容器map/vector的区别相关推荐

  1. java中list,set,map集合的区别,及面试要点

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

  2. Java中 List、Set、Map 之间的区别

      小博此篇记录了开发过程中常用的几种集合详解,三者的区别对比均从IDEA相关层次图里面所得知,基于JDK8,如有错误欢迎批评指正. List(列表)   List的元素以线性方式存储,可以存放重复对 ...

  3. 面试题:Java中list、set、map之间的区别

    1.集合的体系 为什么要了解list.set.map呢? 答:我们在编写程序的过程中经常会对容器中的元素进行增删改查,那么如何快速又准 确的定位到你想访问到的元素呢?就不得不提到我们的常用的单列结合C ...

  4. c# list 容量_C#中数组、ArrayList和List三者的区别 转

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

  5. C#中数组、ArrayList和List三者的区别(转) ,加修改

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

  6. C++ STL : 模拟实现STL中的关联式容器map和set

    目录 关联式容器 键值对 底层红黑树的改造 仿函数 红黑树的迭代器 完整代码 set set的文档介绍 set的实现 map map的文档介绍 map的实现 operator[] 完整代码 multi ...

  7. C#中数组、ArrayList和List三者的区别

    在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...

  8. C#.NET中数组、ArrayList和List三者的区别

    数组在C#.NET中是最早出现的,在内存中是顺序连续存储的,所以它的索引速度非常快,赋值与修改元素也很简单:但是,也正因为数组是顺序连续存储的,在两个数据间插入数据是很不方便的,而且在声明数组的时候必 ...

  9. c语言从文件中读取数据存入数组_在c语言中数组 a[i++] 和 a[++i]的 区别? 数组a[0]++又是什么意思?...

    在c语言中,数组 a[i++] 和数组 a[++i] 有区别吗? 首先我们先看下面的内容: b = a++; //先计算表达式的值,即先把a赋值给了b:然后a再自加1. b = ++a: //先a自加 ...

最新文章

  1. 尽快卸载这两款恶意浏览器插件!已有近50万用户安装
  2. Bete冲刺第五阶段
  3. OSChina 周一乱弹 —— 抱着漂亮袜子就亲了一口
  4. loadrunner 11 下载地址
  5. 机器学习算法基础——朴素贝叶斯算法
  6. Django 框架篇: 一. Django介绍; 二. 安装; 三. 创建项目;
  7. 零基础学Python(第十章 循环嵌套)
  8. linux 下实现ssh免密钥登录
  9. Apollo 10 — adminService 全量发布
  10. deep learning入门学习
  11. ioslabel阴影,UILabel的内阴影
  12. 高性能队列 Disruptor
  13. 垂直跑马灯水平跑马灯
  14. AWVS13安装教程
  15. html全屏banner轮播代码,jquery自动全屏轮播图banner代码
  16. 移动通信网中的密码算法演进之完整性保护
  17. DataTables warning:table id = TableDate: Cannot reinitialise DataTable的解决办法
  18. P1395 会议 题解
  19. jsBlob数据转为图片
  20. 梯度和梯度算子(Roberts,Sobel,Laplace)

热门文章

  1. Java - 泛型 ( Generic )
  2. 删除数据oracle,oracle删除数据
  3. android 文件大小排序,android 文件列表排序
  4. python executemany_Python MySQLdb executemany
  5. 中职计算机专业阶段成长目标,计算机专业中职生职业生涯规划书
  6. linux常用目录操作命令
  7. el-table click事件多次触发_JavaScript从零开始——DOM事件编程(1)
  8. hbuilderx的快捷键整理pdf_47个电脑快捷键大全,让你工作提升100倍,一般人我不告诉他...
  9. GitHub上最火的40个Android开源项目(一)
  10. 使用 MonoGame* 开发游戏