下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、深入理解C+中的vector类的用法及特性/templateclassT,classAlloc=allocatorclassvector;向量(ecto)是一个封装了动态大小数组的顺序容器(eececo)t。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。vecto类为内置数组提供了一种替代表示,与tr类一样vector是随标准C+I入的标准库的一部分,为了使用vector我们必须包含相关的头文件:#i)clude容性特性:1顺.序序列顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。2动.态数组支持对序列
2、中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加删除元素的操作。能够感知内存分配器的(octor-re容器使用一个内存分配器对象来动态地处理它的存储需求。使用:使用vecto有两种不同的形式,即所谓的数组习惯和习惯。一、数组习惯用法定义一个已知长度的vectorvectort类似数组定义t可以通过ve索引号来访问元素使用v(判断是否是空,vec判断元素个数。ve的元素被初始化为与其类型相关的缺省值:算术和指针类型的缺省值是,对于c类型,缺省值可通过调用这类的缺省构造函数获得,我们还可以为每个元素提供一个显式的初始值来完成初始化,例如vectorive
3、c,10,-1);定义了v它包含十个型的元素每个元素都被初始化为对于内置数组我们可以显式地把数组的元素初始化为一组常量值,例如:i)tia6=-2,-1,0,1,2,1024;我们不能用同样的方法显式地初始化vector但是可以将vectos始化为一个已有数组的全部或一部分,只需指定希望被用来初始化vector)数组的开始地址以及数组最末元的下一位置来实现,例如:把的个元素拷贝到vecvectorivec,ia,ia+6);被传递给ve的两个指针标记了用来初始化对象的值的范围,第二个指针总是指向要拷贝的末元素的下一位置,标记出来的元素范围也可以是数组的一个子集,例如/拷/贝3个元素ia2,ia
4、3,ia4vectorivec,&ia2,&ia5);与内置数组不同vecto可以被另一个vecto初始化或被赋给另一个vecto例如vectorsvec;voidinit_and_assign()/用另一个vector初始化一个vectorvectoruser_names(svec);/./把一个vector拷贝给另一个vectorsvec=user_names;二、STL习惯用法在STL9中对vector的习惯用法完全不同。我们不是定义一个已知大小的vector,而是定义一个空vectorvectortext;我们向vector中插入元素,而不再是索引元素,以及向元素赋值,例如push_b
5、ack()操作,就是在vector的后面插入一个元素下面的while循环从标准输入读入一个字符串序列并每次将一个字符串插入到vector中stringword;while(cinword)text.push_back(word);/.虽然我们仍可以用下标操作符来迭代访问元素coutwordsreadare:n;for(intix=0;ixtext.size();+ix)couttextix;coutendl;但是更典型的做法是使用vector操作集中的begin()和end()所返回的迭代器iterator对:coutwordsreadare:n;for(vector:iteratorit=t
6、ext.begin();it!=text.end();+it)cout*it;coutendliterator是标准库中的类,它具有指针的功能复制代码代码如下:*it;对迭代器解引用,并访问其指向的实际对象复制代码代码如下:+it;向前移动迭代器it使其指向下一个元素注意不要混用这两种习惯用法,例如,下面的定义vectorivec;定义了一个空vector再写这样的语句ivec0=1024;就是错误的,因为ivec还没有第一个元素,我们只能索引vector中已经存在的元素size()操作返回vector包含的元素的个数。类似地当我们用一个给定的大小定义一个vector时,例如:vectoria
7、(10);任何一个插入操作都将增加vector的大小,而不是覆盖掉某个现有的元素,这看起来好像是很显然的,但是下面的错误在初学者中并不少见:constintsize=7;intiasize=0,1,1,2,3,5,8;vectorivec(size);for(intix=0;ixsize;+ix)ivec.push_back(iaix);程序结束时ivec包含14个元素,ia的元素从第八个元素开始插入。深入理解在向量中,所有元素都是连续存储的。也就是说,不仅可以通过迭代器(Iterators)访问各个元素,也可以通过指向元素的指针加上偏移来访问。还意味着,当向任意函数传递向量的一个元素的指针时
8、,这个指针可以直接被认为指向了一个数组中的某个元素。向量内部的存储调整是自动处理的,按需扩展或压缩。通常,相比静态数组Staticarrays),向量将会占用更多的存储空间,因为额外的内存将被未来增长的部分所使用。就因为这点,当插入元素时,向量不需要太频繁地重分配Reallocate)内存。当前最大容量可以通过函数capacity()查询。额外的内存可以通过调用shrink_to_fit()函数返还给操作系统。当增加向量对象中的序列的长度时,如果超出当前存储容量上限,就会发生内存重分配己Reallocation),即内部将会重新分配一个数组,然后按顺序逐个拷贝元素。其它的插入及删除操作将会修改
9、序列中部分元素的内存地址。在上述所有情况下,指向序列中被修改部分的迭代器或引用将会失效。当未发生内存重分配,仅指向插入或删除点之前元素的迭代器或引用才会保持有效性。标准库可以执行不同的增长策略来平衡内存的使用量与重分配所耗的性能。但不管哪种情况下,重分配内存的大小必须以指数方式增长,只有这样,才能将在向量末尾逐个插入元素所需的时间复杂度整体分摊Amortized)为一个恒定值。内存重分配就性能而言是一个高代价操作。如果在使用向量前知道元素的数量,可以通过reserve。消除内存重分配。向量支持在序列末尾恒定耗时的插入及删除元素。而在向量的中间插入或删除元素则需要线性的时间。在只涉及向序列起始或未尾插入及删除元素操作时,std:deque容器的性能将会高出很多。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《园林树木》课程标准
- 2BizBoxERP用户基础手册
- 三角形的翻折课件
- 第1单元 古代亚非文明(高频选择题50题)(原卷版)
- 2024年农业和农村档案工作总结
- 七年级下《保护野生动物》苏教版-课件
- 农业科创:研发力量展示
- 机场服务行业销售工作总结
- 资金借贷合同个人医疗保健费用贷款支出租赁保险三篇
- 初一生物教学工作总结实践探索培养动手能力
- 2024-2030年中国天然靛蓝行业市场规模预测及发展可行性分析报告
- DB37T 4548-2022 二氧化碳驱油封存项目碳减排量核算技术规范
- 2024国家开放大学基础写作形考任务2试题及答案
- 2023-2024学年江苏省苏州市高一(上)期末地理试卷
- 干法读书会分享
- 进阶练12 材料作文(满分范文20篇)(解析版)-【挑战中考】备战2024年中考语文一轮总复习重难点全攻略(浙江专用)
- 骨质疏松的中医中药治疗
- 卫浴销售部门年终总结
- 2024年高考真题-化学(天津卷) 含解析
- 安徽省芜湖市2023-2024学年高二上学期期末考试 物理 含解析
- 2024年招投标培训
评论
0/150
提交评论