c语言实现容器,C语言三种容器:list vector和deque的区别

在写C++程序的时候会发现STL是一个不错的东西,减少了代码量,使代码的复用率大大提高,减轻了程序猿的负担。还有一个就是容器,你会发现要是自己写一个链表、队列,或者是数组的时候,既要花时间还要操心怎么去维护,里面的指针啊,内存够不够用啊,长度问题,有没有可能溢出啊等等一系列的问题等着我们去解决,还是比较头疼的。所以容器的出现解决了这一个问题,它将这些数据结构都封装成了一个类,只需要加上头文件,我们就可以轻松的应用,不用那么复杂,就连指针也被封装成了迭代器,用起来更方便,更人性化,方便了我们的编程,对于程序员来说还是一大福音!!

C++中的容器类包括“顺序存储结构”和“关联存储结构”,前者包括vector,list,deque等;后者包括set,map,multiset,multimap等。若需要存储的元素数在编译器间就可以确定,可以使用数组来存储,否则,就需要用到容器类了。

1、vector

连续存储结构,每个元素在内存上是连续的;支持高效的随机访问和在尾端插入/删除操作,但其他位置的插入/删除操作效率低下;相当于一个数组,但是与数组的区别为:内存空间的扩展。vector支持不指定vector大小的存储,但是数组的扩展需要程序员自己写。

vector的内存分配实现原理:

STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储(VS6.0是两倍,VS2005是1.5倍),所以这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。

扩充空间(不论多大)都应该这样做:

(1)配置一块新空间

(2)将旧元素一一搬往新址

(3)把原来的空间释放还给系统

注:vector 的数据安排以及操作方式,与array 非常相似。两者的唯一差别在于空间的利用的灵活性。Array 的扩充空间要程序员自己来写。

vector类定义了好几种构造函数,用来定义和初始化vector对象:

vector  v1;  vector保存类型为T的对象。默认构造函数v1为空。

vector v2(v1);  v2是v1的一个副本。

vector v3(n, i);  v3包含n个值为i的元素。

vector v4(n);   v4含有值初始化的元素的n个副本。

2、deque

连续存储结构,即其每个元素在内存上也是连续的,类似于vector,不同之处在于,deque提供了两级数组结构, 第一级完全类似于vector,代表实际容器;另一级维护容器的首位地址。这样,deque除了具有vector的所有功能外,还支持高效的首/尾端插入/删除操作。

deque   双端队列 double-end queue

deque是在功能上合并了vector和list。

优点:(1) 随机访问方便,即支持[ ]操作符和vector.at()

(2) 在内部方便的进行插入和删除操作

(3) 可在两端进行push、pop

缺点:占用内存多

使用区别:

(1)如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

(2)如果你需要大量的插入和删除,而不关心随机存取,则应使用list

(3)如果你需要随机存取,而且关心两端数据的插入和删除,则应使用deque

3、list

非连续存储结构,具有双链表结构,每个元素维护一对前向和后向指针,因此支持前向/后向遍历。支持高效的随机插入/删除操作,但随机访问效率低下,且由于需要额外维护指针,开销也比较大。每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。

优点:(1) 不使用连续内存完成动态操作。

(2) 在内部方便的进行插入和删除操作

(3) 可在两端进行push、pop

缺点:(1) 不能进行内部的随机访问,即不支持[ ]操作符和vector.at()

(2) 相对于verctor占用内存多

使用区别:

(1)如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

(2)如果你需要大量的插入和删除,而不关心随机存取,则应使用list

(3)如果你需要随机存取,而且关心两端数据的插入和删除,则应使用deque

4、vector VS. list VS. deque:

a、若需要随机访问操作,则选择vector;

b、若已经知道需要存储元素的数目,则选择vector;

c、若需要随机插入/删除(不仅仅在两端),则选择list

d、只有需要在首端进行插入/删除操作的时候,还要兼顾随机访问效率,才选择deque,否则都选择vector。

e、若既需要随机插入/删除,又需要随机访问,则需要在vector与list间做个折中-deque。

f、当要存储的是大型负责类对象时,list要优于vector;当然这时候也可以用vector来存储指向对象的指针,

同样会取得较高的效率,但是指针的维护非常容易出错,因此不推荐使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二十一章流 5 多种打开文件的方式 文件存在,文件不存在

// 第二十一章流 5 多种打开文件的方式 文件存在,文件不存在 /* ios::in 打开文件进行读操作,即读取文件中的数据 ios::out 打开文件进行写操作,即输出数据到文件中 ios::ate 打开文件时针指向文件末尾,但是你可以在文件中的任何地…

如何高效的比较两个 Object 对象是否相等?

咨询区 DmitryBoyko:我有两个复杂的对象 Object1 和 Object2,这两个对象大概有 5 层的深度。我现在需要一个快速的方法比较两个对象是否相等,请问我该如何实现?回答区 vivek nuna:如果你的class是一个不可变的&#xf…

大型网站架构系列:电商网站架构案例

为什么80%的码农都做不了架构师?>>> #0 系列目录# 大型分布式网站架构大型分布式网站架构技术总结大型网站架构系列:电商网站架构案例#1 电商案例原因# 分布式大型网站,目前看主要有几类1.大型门户,比如网易&#xff…

八、结构模式之组合(Composite)模式

组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系。其可以使客户端将单纯元素和组合元素同等对待。 当需求中是体现部分与整体层次的结构时,以及你希望用户可以忽…

代言男科、站台微商、变身神棍....这些科学家被捧了几十年,黑历史曝光后,让人三观尽毁......

全世界只有3.14 % 的人关注了爆炸吧知识说到诺贝尔奖得主,尤其科学类奖项,吃瓜群众的感受常常是:不明觉厉。关于他们有多牛x的故事,你肯定听了不少。但你一定很少听过,诺奖得主转而研究伪科学,或者为了恰饭疯狂掉节操的…

Android之手机出现已安装了存在签名冲突的同名数据包的原因及解决办法

如果你不是开发者:如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步提示你:已安装了存在签名冲突的同名数据包,然后安装失败。这是因为旧版软件的签名信息与新版不一致造成的。你可以卸载这个软件,然…

bmp文件c语言程序解读,bmp文件头_C语言解析BMP文件的结构

摘要 腾兴网为您分享:C语言解析BMP文件的结构,周公解梦,小睡眠,完美志愿,琦书屋等软件知识,以及今日头条,广告点击软件,迅雷资源搜索引擎,东兴证券软件,一键盘锁屏&#…

使用Outlook 2007连接到Exchange Server 2003、2007时出现没有默认网关的错误

在使用Outlook 2007作为客户端连接到Exchange Server 2003/2007时,会出现一个错误提示:"到Microsoft Exchange的连接不可用。您的网络适配器没有默认网关。"解决方法:1. 单击“开始”,单击“运行”,在“打开…

C# WPF MVVM开发框架Caliburn.Micro入门介绍①

01—Caliburn.Micro简介Caliburn.Micro是一套基于XAML的MVVM模式的开发框架,它小巧而强大。在CaliburnMicro中只需要按照约定把View的名字加上后缀ViewModel,就是它的View Model 的名字,如:MainPage和 MainPageViewModel。Caliburn.Micro自动…

深度分析 Java 的 ClassLoader 机制(源码级别)(转)

写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoader的loadClass&am…

Struts2和Struts1的不同

转载(没看懂) Action 类 ◆Struts1要求Action类继承一个抽象基类org.apache.struts.action.Action。Struts1的一个普遍问题是使用抽象类编程而不是接口。 ◆Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定…

拉屎能赚钱?在马桶上月入过万?原来卫生间里还有这么多隐藏福利,超模君都惊了……

全世界只有3.14 % 的人关注了爆炸吧知识模友们,你们有过“带薪拉屎”的经历吗?没错,假如我们每天花10分钟“带薪拉屎”,那一年大概能积攒下来40小时,假如我们每天工作8小时,等于多了5天年假,白嫖…

Android之让图片匀速旋转效果

图片匀速旋转 当我们更新的时候,需要把更新小图标旋转起来,不废话,先爆照 介绍动画: Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类是 Frame 动画,即顺序播放事先…

C语言计算一个数的平方根立方根,怎样快速计算出一个数的平方根立方根?

我定义a^bab(10a b)^2 100a^2 20ab b^2 100a^2 b(20a b)a代表已经计算结b代表前需要计算位数每计算程100a^2都减掉剩b(20a b)需要做找整数b使b(20a b)>b,(10*a b)^n-(10*a)^n≈n*(10*a)^(n-1)*b,即:b≈41221398234/n/(10*a)^(n-1)41221398234/5/180^4≈7。85,取b7各步都更…

百度语言翻译机

百度语言翻译机 2006 年百度之星程序设计大赛初赛题目 6 百度语言翻译机 时限 1s 百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特的缩率语。他们在平时的交谈,会议,甚至在各中技术文档中都…

Android之如何使用快速联系徽章

翻译地址:http://code.tutsplus.com/tutorials/android-quick-tip-using-the-quick-contact-badge--mobile-2245 如果你花任何时间在一个Android设备,您可能已经注意到你可以点击小图片联系如何启动一个工具栏与很多不同的行为,如电话、短信、邮件的人。 在这个快速提示,您…

dotnet 使用 Infer# 自动分析代码缺陷

本文告诉大家如何使用 Infer# 开源库配合 GitHub 的 Action 实现自动分析代码缺陷,如找到可空引用或线程安全等问题这是一个在 GitHub 上完全开源的仓库,请看 https://github.com/microsoft/infersharp刚好今天收到了 Infer# 发布 1.2 版本博客&#xff…

发了篇paper,双非二本的她直博浙大

全世界只有3.14 % 的人关注了爆炸吧知识大家好,我是小南,本科就读于国内某双非二本院校,于2019年拿到了浙江大学的直博录取函。很多人问我从二本院校成功跨越到国内知名高校的秘诀是什么,我个人觉得,除开运气&#xff…

FZU 2095 水面高度

一共六种情况。手算即可。 #include<cstdio> #include<cstring> #include<cmath>int T; double a,b,c,d,x; double ans;int main() {scanf("%d",&T);while(T--){scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&x);doubl…

android+清除循环动画,android - 如何使用ViewPropertyAnimator生成循环动画?

我想构建一个TextViews动画&#xff0c;在完成后会自动重复。对于我要设置动画的每个View&#xff0c;我使用以下代码final float oldX v.getX();final float newX v.getX() - (float)totalWidth;final AnimatorListenerAdapter listener new AnimatorListenerAdapter() {Ov…