vector:
表示一段连续的内存区域,每个元素被顺序存储在这段内存中,
对vector的随机访问效率很高,但对非末尾元素的插入和删除则效率非常低。

deque:
也表示N段连续的内存区域组成,但与vector不同的是它支持高效地在其首部插入和删除元素,
它通过两级数组结构来实现,一级表示实际的容器,第二级指向容器的首和尾

list:
表示非连续的内存区域并通过一对指向首尾元素的指针双向链接起来,
插入删除效率高,随机访问效率低

使用:
它们的使用很相似,
#include <vector>
#include <deque>
#include <list>
//下面是一段代码:
std::list<int> a;
a.push_back(5);//从尾部插入数据
a.push_front(7);//从头部插入数据
std::list<int>::iterator p=a.begin();//得到头部数据指针,把iterator 当成指针比较容易理解
*p=10;//修改头部数据
int i=*p;//得到数据
a.pop_front();//释放第一个数据

注意点
1.当执行大数据量的调用push_back()的时候,记住要调用vector::reserve()。
2.如果你计划使用insert(),或者需要pop_front(),那就使用deque。
3.deque是大块大块地分配内存,每次插入固定数量的数据。vector是就近分配内存(这可能不是一个坏的事情)。
但我们应该关注是,vector每次增加的内存足够大的时候,在当前的内存不够的情况。deque不需要capacity()和reserve()> 是非常有道理的。
4.*.vector内部分配的内存是永不释放的,即使你调用clear()也不会,这一点很不好,有误导性。
有可能一个vector只在瞬间需要很大的容量,但大多数时间只需要很小的容量,结果却是长时间的占用了很大的,没有被使用到的内存。
vector也没有提供函数来释放它内部的内存,不过有一个简单的办法,前几天在网上找到的:
i_math::vector<BYTE>buf;
buf.resize(100000);//分配了一块至少100000 bytes的内存
if (TRUE)//清空buf的内存
{
i_math::vector<BYTE> t;
buf.swap(t);//把这块内存交换到一个临时的vector里去
}
assert(buf.capacity()==0);//内存被清空了
5.*.deque就不一样了,deque永远不会占用太多冗余的内存,你只需要把它resize()到一个你希望的大小,它会自动释放掉那些被多余占用的内存
6.vector还有一个不好的地方,当你往一个vector里添加一个成员的时候,所有指向这个vector的原来成员的指针就不能保证有效了,
因为 vector会re-alloc内存.而deque不会,无论从前面还是后面添加新成员,旧的成员都不会移动位置,这一点有时候很有用

vector,deque,list的区别和使用的更多相关文章

  1. HDU5127 神坑题---vector 、 list 、 deque 的用法区别

    题意:三个操作 1  a b : 队列中加入(x = a, y = b); -1  a b : 队列中减去(x = a, y = b); 0  p q :从队列的数对中查询哪一对x,y能够让 p * ...

  2. stl 中List vector deque区别

    stl提供了三个最基本的容器:vector,list,deque.         vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此     它能非常好的支持随 ...

  3. 顺序容器:vector,deque,list

    1.顺序容器:vector,deque,list 容器类共享公共接口,只要学会其中一种类型就能运用另一种类型.每种容器提供一组不同的时间和功能这种方案,通常不需要修改代码,秩序改变类型声明,每一种容器 ...

  4. 【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

    原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,Hash ...

  5. 一道java笔试题目:Vector和ArrayList的区别

    Vector和ArrayList的区别 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构这些类均在java.util包中本文试图通过 ...

  6. C++ vector和list的区别

    1.vector数据结构vector和数组类似,拥有一段连续的内存空间,并且起始地址不变.因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存 ...

  7. 源码分析三(Vector与ArrayList的区别)

    前面讨论过ArrayList与LinkedList的区别,ArrayList的底层数据结构是数组Object[],而LinkedList底层维护 的是一个链表Entry,所以对于查询,肯定是Array ...

  8. vector deque list

    vector ,deque 和 list 顺序性容器: 向量 vector :   是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可 ...

  9. C/C++中vector与list的区别

    1.vector数据结构vector和数组类似,拥有一段连续的内存空间,并且起始地址不变.因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存 ...

随机推荐

  1. 存储过程TYPE类型参数调试

    当我们写完一段存储过程后,必然需要调试运行一下写的代码是否能成功运行,当参数是字符,数字或日期时,可以直接在测试窗口输入值.但是类型如果是定义好的TYPE,就无法简单的输入. 一.自定义TYPE TY ...

  2. POJ2955(KB22-C 区间DP)

    Brackets Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 7823Accepted: 4151 Description We ...

  3. openstack-on-centos7之环境准备

    centos7配置静态ip ifconfig查看网卡信息并获取到网卡的名称eth0s3 ifconfig 进入到网卡配置目录 cd /etc/sysconfig/network-scripts/ 找到 ...

  4. python并发编程-线程和锁

    什么是线程 进程:资源分配单位 线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程 线程的两种创建方式: from multiprocessing import Pr ...

  5. 【读书笔记】iOS-关闭键盘的2种方法

    一种是通过使用键盘上的return键关闭键盘,一种是通过触摸背景关闭键盘. 参考资料:<iOS7开发快速入门>

  6. <Android 基础(三 十)> Fragment (3) ~ PreferenceFragment

    简介 PreferenceFragment , 展示一系列的Preference条目并且当与用户有交互时,产生的值会自动保存到SharedPreferences中,通过PreferenceManage ...

  7. Oracle常用方法备份

    1.UNION ALL 和UNION.INTERSECT.MINUS 连接所有的查询结果.去掉重复的结果.操作返回查询结果中公共的行.在进行两个表格或者两个查询结果的时候,返回在第一个表格/查询结果中 ...

  8. centos安装pip3

    安装pip3 1:安装依赖 yum install openssl-devel -y yum install zlib-devel -y 2:安装setuptools wget --no-check- ...

  9. visual studio 单元测试的认识

    单元测试(unit testing),对软件中的最小单元进行检查和验证,其一般验证对象是一个函数或者一个类. Team Test 是 Visual Studio 集成的单元测试框架,它支持: 测试方法 ...

  10. poj_3253 Fence Repair

    Fence Repair Description Farmer John wants to repair a small length of the fence around the pasture. ...