个人博客网站设计,萧山建设信用网,甜品网页设计图片,深圳网站备案时间vector 
vector类型是一个标准库中的类型#xff0c;代表一个容器、集合或者动态数组这样一种概念。既然是容器#xff0c;那就可以把若干个对象放到里面。当然#xff0c;这些对象的类型必须相同。简单来说#xff0c;可以把一堆int型数字放到vector容器中去#xff0c;复…vector 
vector类型是一个标准库中的类型代表一个容器、集合或者动态数组这样一种概念。既然是容器那就可以把若干个对象放到里面。当然这些对象的类型必须相同。简单来说可以把一堆int型数字放到vector容器中去复杂点说可以把一堆相同类型的类对象放到vector容器中去。 
所以如果换个角度考虑vector能把其他对象装进来所以称为容器非常合适。容器这个概念经常被提及读者要知道和理解这个概念。 
要想使用这种类型需要在.cpp源文件开头包含vector头文件  另外为了方便引用这种类型也要书写  定义一个vector类型对象。显然一旦定义出来这个对象就是容器了。例如想在里面保存int型数据容器里面所要装的元素类型看如下代码  上面的代码定义了一个vector类型的对象名字叫作vjihe这个对象里面保存的就是int型数据。为什么是int型数据呢读者可以看到vector后面有一对“”“”里面是int表示这个vector类型的对象容器里面存放的是int型对象int型数据/元素。 
这个int的写法读者可能第一次见到会觉得是一种奇怪的写法在后面章节中会讲到“类模板”的概念其实vector就是一个类模板这里的“”实际上是类模板的一个实例化过程。但是类模板的实例化过程眼下对于读者来讲理解起来还比较生涩后面学习模板的时候再详细阐述所以这里笔者换一种说法来帮助读者理解类模板。 
vector理解成一个残缺的类类型这意味着使用时光有类名vector还不够还需要额外给vector类模板提供其要在其中保存什么类型数据的信息这个信息就是通过int来提供模板名后跟一对“”“”内放入类型信息所以在使用vector时一定要在它后面跟一对“”并在其中跟一个该vector容器中要保存的数据元素类型的信息这才算一个完整的类型完整的类类型。例如vector不是一个完整类型而vectorint却是一个完整的类型。看看如下范例  一般来讲vector容器里面可以装很多种不同类型的数据作为其元素容器中装的内容简称“元素”。看看如下范例  但是vector不能用来装引用。请记住引用只是一个别名不是一个对象。所以下面的写法会报语法错误  
定义和初始化vector对象 
1空vector。 定义如下 
vectorstring mystr;
//创建一个string类型的空vector对象容器
//现在mystr里不包含任何元素后续就可以用相关的一些操作函数往这个空对象里增加数据了。 
例如可以往这个容器的末尾增加一些数据。这里可以使用vector的成员函数push_back往容器末尾增加数据。看看如下范例注意看它的下标[0][1][2]…不断增长如图13.3所示。 
mystr.push_back(abcd);
mystr.push_back(def);2在vector对象元素类型相同的情况下进行vector对象元素复制新副本。 
vectorstring mystr2(mystr);	//把mystr元素复制给了mystr2
vectorstringmystr3  mystr;	//把mystr元素复制给了mystr33在C11中还可以用初始化列表方法给初值这个时候用“{}”括起来。 
vectorstring def  {aaa,bbb,ccc};当然“{}”里面为空也可以那就相当于没有初始化是一个空的vector了。 
4创建指定数量的元素。请注意有元素数量概念的初始化用的都是“”。 
如果不给元素初值那么元素的初值要根据元素类型而定例如元素类型为int系统给的初值就是0元素类型为string系统给的初值就是但也存在有些类型必须给初值否则就会报错。 如下范例演示不给元素初值的情况 
vectorint ijihe2(20);	//20个元素下标[0]~[19]每一个元素值都为0
vectorstring sjihe2(5);	//15个元素下标[0]~[4]每一个元素值都为5多种初始化。“”一般表示对象中元素数量这种概念“{}”一般表示元素的内容这种概念但又不是绝对。看看如下范例  
vector对象上的操作 
其实在使用vector时最常见的情况是并不知道vector里会有多少个元素使用时会根据需要动态地增加和减少。所以一般来讲使用者是先创建一个空的vector对象然后通过代码向这个vector里增加或减少元素。这里将要介绍一些vector类型提供的常用方法。vector上很多的操作和string很相似。 1判断是否为空empty返回布尔值。 vectorint ivec;if (ivec.empty())   //条件成立{   coutivec为空endl;}2push_back一个非常常用的方法用于向vector末尾增加一个元素。 vectorint ivec;  //先声明成空的vector对象ivec.push_back(1);ivec.push_back(2);for (int i3;i100;i){ivec.push_back(i);}在上面的范例中注意观察能够发现值2在值1的后面最后插入的元素在vector容器的最末尾。调试结果如下图所示。 
3size返回元素个数。 4clear移除所有元素将容器清空。 5v[n]返回v中的第n个字符n是一个整型值位置从0开始计算位置值n也必须小于.size如果下标引用超过这个范围或者用下标访问一个空的vector都会产生不可预测的结果因为编译器可能发现不了这种错误  6赋值运算符。 vectorint ivec;//先声明成空的vector对象ivec.push_back(1);ivec.push_back(2);for (int i3;i100;i){ivec.push_back(i);}vectorint ivec2;ivec2.push_back(111);ivec2ivec;//也得到了100个元素用ivec中的内容取代了ivec2中原有内容上行这个111就//被冲掉了ivec2{12,13,14,15};//用{}中的值取代了ivec2原有值coutivec2.size()endl;  //47相等和不等和!。 两个vector对象相等元素数量相同对应位置的元素值也都相同。否则就是不相等。  8范围for的应用和讲解string时对范围for的应用类似 vectorint vecvalue{1,2,3,4,5 };for(auto vecitem:vecvalue)  //为了修改vecvalue内部值这里是引用引用会绑定到元素上达//到通过引用改变元素值的目的vecitem * 2;       //扩大一倍for (auto vecitem : vecvalue)cout  vecitem  endl;针对范围for语句这里希望引申一步进行讲解。如果在范围for中增加改变vector容量的代码则输出就会变得混乱 vectorint vecvalue{1,2,3,4,5 };for (auto vecitem : vecvalue){vecvalue.push_back(888);cout  vecitem  endl;}范围for在这里用来遍历vector容器中的元素。这里的vecitem是定义的一个变量后面的vecvalue是一个序列容器for语句中使用auto来确保序列中的每个元素都能够转换成变量vecitem对应的类型所以一般在范围for语句中习惯使用auto编译器来指定合适的vecitem类型。 
那为什么上述代码会产生混乱的输出呢 
因为每次执行for循环都会重新定义vecitem并且把它的值初始化成vecvalue序列中的下一个值。在刚刚进入这个for循环时在系统内部会记录序列结束的位置值但一旦在这个范围for里面改动这个序列的容量如增加/删除元素那么这个序列结束的位置值就肯定会发生改变这个改变会导致for语句的混乱其输出的值也就乱了。 
所以请记住一个结论在for语句中不要改变vector的容量增加、删除元素都不可以。请读者千万千万不要写出这种错误代码否则隐患无穷切记切记 
迭代器精彩演绎、失效分析及弥补、实战 
迭代器简介 
迭代器是一个经常听到和用到的概念。上一节学习了vector笔者说过这是一个容器里面可以容纳很多对象。那迭代器是什么呢迭代器是一种遍历容器内元素的数据类型。这种数据类型感觉有点像指针读者就理解为迭代器是用来指向容器中的某个元素的。 
string可以通过“[]”下标访问string字符串中的字符vector可以通过“[]”访问vector中的元素。但实际上在C中很少通过下标来访问它们一般都是采用迭代器来访问。 
除了vector容器外C标准库中还有几个其他种类的容器。这些容器都可以使用迭代器来遍历其中的元素内容。string其实是字符串不属于容器但string也支持用迭代器遍历。 
通过迭代器可以读取容器中的元素值、修改容器中某个迭代器所代表所指向的元素值。此外迭代器可以像指针一样——通过、–等运算符从容器中的一个元素移动到另一个元素。 
许多容器如上述的vector在C标准库中还有其他容器如list、map等都属于比较常用的容器C标准库为每个这些容器都定义了对应的一种迭代器类型有很多容器不支持“[]”操作但容器都支持迭代器操作。写C程序时笔者也强烈建议读者不要用下标访问容器中的元素而是用迭代器来访问容器中的元素。 
容器的迭代器类型 
刚刚讲过C标准库为每种容器都定义了对应的迭代器类型。这里就以容器vector为例演示一下 vectorint iv  {100,200,300};     //定义一个容器vectorint :: iterator iter;       //定义迭代器也必须是以vectorint开头上面的语句是什么意思呢后面这条语句定义了一个名为iter的变量迭代器这个变量的类型是vectorint::iterator类型请注意这种写法“::iterator”。iterator是什么它是每个容器如vector里面都定义了的一个成员类型名这个名字是固定的请牢记。 在理解的时候就把整个vectorint::iterator理解成一种类型这种类型就专门应用于迭代器当用这个类型定义一个变量的时候这个变量就是一个迭代器。 
迭代器begin/end、反向迭代器rbegin/rend操作 
1.迭代器 
每一种容器如vector都定义了一个叫begin的成员函数和一个叫end的成员函数。这两个成员函数正好用来返回迭代器类型。看看如下范例。 1begin返回一个迭代器类型就理解成返回一个迭代器。  2end返回一个迭代器类型就理解成返回一个迭代器。  对上面的代码进行跟踪调试观察begin和end结果可以看到end指向了一个乱数字如图13.5所示。 vectorint iv  {100,200,300};     //定义一个容器vectorint ::iterator iter;       //定义迭代器也必须是以vectorint开头iter  iv.begin();iter  iv.end(); 3如果容器为空则begin返回的迭代器和end返回的迭代器相同。看看如下范例 vectorint iv2;vectorint::iterator iterbegin  iv2.begin();vectorint::iterator iterend  iv2.end();if (iterbegin  iterend)   //条件成立{cout  容器为空  endl;} 所以end返回的迭代器并不指向容器vector中的任何元素它起到实际上是一个标志岗哨作用如果迭代器从容器的begin位置开始不断往后游走也就是不断遍历容器中的元素那么如果有一个时刻iter走到了end位置那就表示已经遍历完了容器中的所有元素。 4写一段代码传统的通过迭代器访问容器中元素的方法如下 vectorintiv{100,200,300};    //定义一个容器//经典传统用法这里用、等运算符来对迭代器进行操作for (vectorint::iterator iter  iv.begin();iter ! iv.end();iter){cout  *iter  endl;}运行起来看结果100、200、300。 
2.反向迭代器 
如果想从后面往前遍历一个容器那么用反向迭代器就比较方便。反向迭代器使用的是rbegin成员函数和rend成员函数。 1rbegin返回一个反向迭代器类型指向容器的最后一个元素。 2rend返回一个反向迭代器类型指向容器的第一个元素的前面位置。 rbegin和rend成员函数指向的容器位置示意图如图13.7所示。  看看如下范例 vectorintiv{100,200,300};for (vectorint::reverse_iterator riter  iv.rbegin(); riter ! iv.rend(); riter){cout*riterendl;} 
运行起来看结果300、200、100。 
迭代器运算符 
1iter返回迭代器iter所指向元素的引用。必须要保证该迭代器指向的是有效的容器元素不能指向end因为end是末端元素后面的位置也就是说end已经指向了一个不存在元素。前面的cout≪iter≪endl就是使用*iter的演示范例这里不做进一步演示了。 2iter和iter是同样的功能——让迭代器指向容器中的下一个元素。但是已经指向end的迭代器不能再否则运行时报错。 3–iter和iter–是同样的功能——让迭代器指向容器中的前一个元素。了解自然也就能了解–。看看如下范例  4iter1iter2或iter1!iter2判断两个迭代器是否相等。如果两个迭代器指向的是同一个元素就相等否则就不相等。 5结构成员的引用。看看如下范例  请注意一定要确保迭代器指向有效的容器中的元素否则范例中的这些行为可能会导致意想不到的结果。还有很多其他运算符例如迭代器之间可以相减表示两个迭代器之间的距离迭代器加一个数字表示跳过多少个元素不过这些都不常用不准备逐一介绍意义也不大。读者如果以后遇到有了现在所学的基础再简单学习一下即可。 
const_iterator迭代器 
前面学习了iterator这种迭代器类型实际上每种容器还有另外一种迭代器类型叫作const_iterator从名字上能感觉到其含义有const在一般都表示常量也就是说值不能改变的意思。这里的值不能改变表示该迭代器指向的元素的值不能改变并不表示该迭代器本身不能改变该迭代器本身是能改变的也就是说该迭代器是可以不断地指向容器中的下一个元素的。 
所以该迭代器只能从容器中读元素不能通过该迭代器修改容器中的元素。所以说从感觉上来讲const_iterator更像一个常量指针而iterator迭代器是能读能写的。看看如下范例 什么时候用const_iterator呢如果这个容器对象是一个常量那么就必须使用const_iterator否则报错  这里再额外看一看cbegin和cend成员函数。这是C11引入的两个新函数与begin、end非常类似。但是不管容器是否是常量容器cbegin、cend返回的都是常量迭代器const_iterator。看看如下范例  
迭代器失效 
上一节在讲vector容器时谈过范围for循环语句——在遍历容器的时候如果在for循环中通过push_back等手段往容器中增加元素范围for循环输出的容器中元素就会混乱。其实范围for语句等价于常规的用迭代器对容器进行操作。看如下代码 vectorint vecvalue{1,2,3,4,5 };for (auto vecitem:vecvalue){cout  vecitem endl;}等价于迭代器这种操作方式  但如果一旦在for循环中增删容器中的元素就会导致迭代器失效整个结果就混乱了。 其实任何一种能够改变vector对象容量的操作如push_back都会使当前的vector对象迭代器失效所以请读者谨记在操作迭代器的过程中使用了迭代器的这种循环体千万不要改变vector对象的容量也就是不要增加或者删除vector容器中的元素。看如下代码  对于向容器中添加元素和从容器中删除元素操作要小心因为这些操作可能都会使指向容器元素的迭代器也包括指针、引用等失效。这种失效就表示它不能再代表任何容器中的元素一旦使用这种失效的迭代器就表示程序的书写犯了严重错误很多情况下都会导致程序崩溃就好比使用了没有被初始化的指针一样。 
不同的容器实现机理不同例如有的容器内部数据是连续存储的插入元素时一旦原有内存不够用则可能就会导致容器中原有数据全部迁移到一个新内存去如vector等容器不同的插入操作、不同的插入位置会导致迭代器、指针、引用部分或者全部失效甚至在循环体中的诸如vecvalue.end代码都会因为插入数据操作导致失效。 
另一种情况是删除操作。如果从容器中删除一个元素那么当前指向这个被删除元素的迭代器、指针、引用肯定是立即失效绝不能再引用它们。 
此外不同的容器针对删除操作不同的删除位置也会导致迭代器、指针、引用部分或者全部失效甚至在循环体中的诸如vecvalue.end代码都会因为删除数据操作导致失效。 
解决方法就是如果在一个使用了迭代器的循环中插入元素到容器那只插入一个元素后就应该立刻跳出循环体不能再继续用这些迭代器操作容器。看看如下范例  下面将进行一些灾难程序演示。 1灾难程序演示1 下面代码目前一切没有问题  接着往循环中增加代码注意while循环体中代码的变化  有些人可能有更多需求例如就是想不断地插入多条数据并且还希望迭代器不失效那就得查资料研究如研究针对vector容器如何写insert这段代码才能让迭代器不失效让程序安全地运行。看如下代码是一种满足连续插入多条数据的解决方案  文章转载自: http://www.morning.rwbh.cn.gov.cn.rwbh.cn http://www.morning.bylzr.cn.gov.cn.bylzr.cn http://www.morning.rszwc.cn.gov.cn.rszwc.cn http://www.morning.dyght.cn.gov.cn.dyght.cn http://www.morning.tgmfg.cn.gov.cn.tgmfg.cn http://www.morning.rnxw.cn.gov.cn.rnxw.cn http://www.morning.spxsm.cn.gov.cn.spxsm.cn http://www.morning.pshpx.cn.gov.cn.pshpx.cn http://www.morning.qptbn.cn.gov.cn.qptbn.cn http://www.morning.clkjn.cn.gov.cn.clkjn.cn http://www.morning.rxwnc.cn.gov.cn.rxwnc.cn http://www.morning.mzhhr.cn.gov.cn.mzhhr.cn http://www.morning.mpszk.cn.gov.cn.mpszk.cn http://www.morning.xsqbx.cn.gov.cn.xsqbx.cn http://www.morning.pxlpt.cn.gov.cn.pxlpt.cn http://www.morning.qxlxs.cn.gov.cn.qxlxs.cn http://www.morning.zthln.cn.gov.cn.zthln.cn http://www.morning.nqpy.cn.gov.cn.nqpy.cn http://www.morning.jmllh.cn.gov.cn.jmllh.cn http://www.morning.jyznn.cn.gov.cn.jyznn.cn http://www.morning.rlhgx.cn.gov.cn.rlhgx.cn http://www.morning.atoinfo.com.gov.cn.atoinfo.com http://www.morning.qkcyk.cn.gov.cn.qkcyk.cn http://www.morning.wjrq.cn.gov.cn.wjrq.cn http://www.morning.zgdnd.cn.gov.cn.zgdnd.cn http://www.morning.cgdyx.cn.gov.cn.cgdyx.cn http://www.morning.jkfyt.cn.gov.cn.jkfyt.cn http://www.morning.fhbhr.cn.gov.cn.fhbhr.cn http://www.morning.jxtbr.cn.gov.cn.jxtbr.cn http://www.morning.ppbrq.cn.gov.cn.ppbrq.cn http://www.morning.pmdzd.cn.gov.cn.pmdzd.cn http://www.morning.symgk.cn.gov.cn.symgk.cn http://www.morning.jlpdc.cn.gov.cn.jlpdc.cn http://www.morning.nkkpp.cn.gov.cn.nkkpp.cn http://www.morning.bhqlj.cn.gov.cn.bhqlj.cn http://www.morning.dmldp.cn.gov.cn.dmldp.cn http://www.morning.glwyn.cn.gov.cn.glwyn.cn http://www.morning.ljdhj.cn.gov.cn.ljdhj.cn http://www.morning.ztqj.cn.gov.cn.ztqj.cn http://www.morning.txtzr.cn.gov.cn.txtzr.cn http://www.morning.jjnry.cn.gov.cn.jjnry.cn http://www.morning.zqkr.cn.gov.cn.zqkr.cn http://www.morning.fbmzm.cn.gov.cn.fbmzm.cn http://www.morning.sfwfk.cn.gov.cn.sfwfk.cn http://www.morning.blxor.com.gov.cn.blxor.com http://www.morning.fqhbt.cn.gov.cn.fqhbt.cn http://www.morning.ddtdy.cn.gov.cn.ddtdy.cn http://www.morning.linzhigongmao.cn.gov.cn.linzhigongmao.cn http://www.morning.zfxrx.cn.gov.cn.zfxrx.cn http://www.morning.rxnxl.cn.gov.cn.rxnxl.cn http://www.morning.thrcj.cn.gov.cn.thrcj.cn http://www.morning.rykw.cn.gov.cn.rykw.cn http://www.morning.mdmc.cn.gov.cn.mdmc.cn http://www.morning.rqxtb.cn.gov.cn.rqxtb.cn http://www.morning.qjrjs.cn.gov.cn.qjrjs.cn http://www.morning.wkwds.cn.gov.cn.wkwds.cn http://www.morning.ywpcs.cn.gov.cn.ywpcs.cn http://www.morning.qxycf.cn.gov.cn.qxycf.cn http://www.morning.zcnfm.cn.gov.cn.zcnfm.cn http://www.morning.tkzrh.cn.gov.cn.tkzrh.cn http://www.morning.lskrg.cn.gov.cn.lskrg.cn http://www.morning.lsqxh.cn.gov.cn.lsqxh.cn http://www.morning.ppqzb.cn.gov.cn.ppqzb.cn http://www.morning.yhywx.cn.gov.cn.yhywx.cn http://www.morning.qqzdr.cn.gov.cn.qqzdr.cn http://www.morning.ymqfx.cn.gov.cn.ymqfx.cn http://www.morning.lpgw.cn.gov.cn.lpgw.cn http://www.morning.rwqj.cn.gov.cn.rwqj.cn http://www.morning.trbxt.cn.gov.cn.trbxt.cn http://www.morning.rnsjp.cn.gov.cn.rnsjp.cn http://www.morning.zlnkq.cn.gov.cn.zlnkq.cn http://www.morning.prgrh.cn.gov.cn.prgrh.cn http://www.morning.kwqqs.cn.gov.cn.kwqqs.cn http://www.morning.lcplz.cn.gov.cn.lcplz.cn http://www.morning.i-bins.com.gov.cn.i-bins.com http://www.morning.llthz.cn.gov.cn.llthz.cn http://www.morning.xtxp.cn.gov.cn.xtxp.cn http://www.morning.bxsgl.cn.gov.cn.bxsgl.cn http://www.morning.mhlsx.cn.gov.cn.mhlsx.cn http://www.morning.lpzqd.cn.gov.cn.lpzqd.cn