您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > VC++中list的使用方法总结
这几天在做图像处理方面的研究,其中有一部分是关于图像分割方面的,图像目标在分割出来之后要做进一步的处理,因此有必要将目标图像的信息保存在一个变量里面,一开始想到的是数组,但是马上就发现使用数组的缺点:数组长度固定,动态分配内存很容易导致错误发生。最重要的一点是我要保存目标图像的每一点的坐标值,使用数组就有点无能为力了。因此到百度、Google大神上面找思路,终于被我发现在c++的标准库里面还有这么一个模板类:list,下面就是对找到的资料的汇总和加工。vc6自带的msdn帮助文档的解释以下是引自msdn帮助文档(中文是我自己翻译的,错误之处请包涵。):Thetemplateclassdescribesanobjectthatcontrolsavarying-lengthsequenceofelementsoftypeT.Thesequenceisstoredasabidirectionallinkedlistofelements,eachcontainingamemberoftypeT.本模板类描述了一个对象,这个对象是类型为T的可变长度的序列元素。这个序列采用双向链表的方式存储每一个元素,其中每一个元素的数据流行都是T。Theobjectallocatesandfreesstorageforthesequenceitcontrolsthroughaprotectedobjectnamedallocator,ofclassA.Suchanallocatorobjectmusthavethesameexternalinterfaceasanobjectoftemplateclassallocator.Notethatallocatorisnotcopiedwhentheobjectisassigned.对序列对象的分配和释放操作通过一个受保护的对象allocator进行。这样一个allocator对象必须有相同的外部接口作为一个模板类分配器的对象。注意:当对象被分配之后allocator不能被复制。Listreallocationoccurswhenamemberfunctionmustinsertoreraseelementsofthecontrolledsequence.Inallsuchcases,onlyiteratorsorreferencesthatpointaterasedportionsofthecontrolledsequencebecomeinvalid.当一个成员要进行insert或者erase操作时,列表的重新分配操作发生。在这种情况下,只有迭代器或者引用所指向的要删除的对象的指针变为无效。msdn帮助文档自带的例子下面为msdn帮助文档中自带的一个例子,该例展示了如何使用迭代器读取列表中的元素和进行插入操作。#includelist#includeiostreamusingnamespacestd;typedeflistintLISTINT;voidmain(){intrgTest1[]={5,6,7};intrgTest2[]={10,11,12};LISTINTlistInt;LISTINTlistAnother;LISTINT::iteratori;//InsertoneatatimelistInt.insert(listInt.begin(),2);listInt.insert(listInt.begin(),1);listInt.insert(listInt.end(),3);//123for(i=listInt.begin();i!=listInt.end();++i)cout*i;coutendl;//Insert3fourslistInt.insert(listInt.end(),3,4);//123444for(i=listInt.begin();i!=listInt.end();++i)cout*i;coutendl;//InsertanarrayintherelistInt.insert(listInt.end(),rgTest1,rgTest1+3);//123444567for(i=listInt.begin();i!=listInt.end();++i)cout*i;coutendl;//InsertanotherLISTINTlistAnother.insert(listAnother.begin(),rgTest2,rgTest2+3);listInt.insert(listInt.end(),listAnother.begin(),listAnother.end());//123444567101112for(i=listInt.begin();i!=listInt.end();++i)cout*i;coutendl;}ProgramOutputis:123123444123444567123444567101112list::list模板类的主要函数介绍assign()//给list赋值back()//返回最后一个元素begin()//返回指向第一个元素的迭代器clear()//删除所有元素empty()//如果list是空的则返回trueend()//返回末尾的迭代器erase()//删除一个元素front()//返回第一个元素get_allocator()//返回list的配置器insert()//插入一个元素到list中max_size()//返回list能容纳的最大元素数量merge()//合并两个listpop_back()//删除最后一个元素pop_front()//删除第一个元素push_back()//在list的末尾添加一个元素push_front()//在list的头部添加一个元素rbegin()//返回指向第一个元素的逆向迭代器remove_if()//按指定条件删除元素remove()//从list删除元素rend()//指向list末尾的逆向迭代器resize()//改变list的大小reverse()//把list的元素倒转size()//返回list中的元素个数sort()//给list排序splice()//合并两个listswap()//交换两个listunique()//删除list中重复的元素常用的操作主要是有插入操作、删除操作。list为实现头尾高效的插入和删除操作而提供了大多数的支持函数,而对于随机访问函数,则只能从头部或者尾部进行遍历操作。关于remove和erase函数上面的介绍中关于插入等等操作都有帮助的例子,但是对于删除函数,这个需要有一些注意的地方。下面请看例子:#includeiostream#includelist#includenumeric#includealgorithmusingnamespacestd;//创建一个list容器的实例LISTINTtypedeflistintTESTINT;voidmain(){//使用TESTINT创建一个list类型的对象TESTINTtest;//使用TESTINT创建一个迭代器对象TESTINT::iteratori;//从前面向listOne容器中添加数据test.push_front(2);test.push_front(1);//从后面向listOne容器中添加数据test.push_back(3);test.push_back(4);//显示删除前的数据coutbeforedeleteendl;for(i=test.begin();i!=test.end();++i)cout*i;coutendl;//从列表中删除一个元素i=test.begin();while(i!=test.end()){inttmp=*i;if(tmp==2){test.erase(i++);//在这里要是指针前进1个,否则迭代器失效}else{i++;}}//显示删除后的数据coutafterdeleteendl;for(i=test.begin();i!=test.end();++i)cout*i;coutendl;}总结在使用list的时候不能使用随机访问的方式,只能按照迭代的方式进行访问,这样的话在进行删除操作的时候就可能会出现某一次删除操作之后指针没有指向下一个有效的元素而导致迭代器失效。因此,在进行删除操作时候最好使用while的方式,使用for循环如果控制不好,可能会导致迭代器失效。使用模版类可以极大的提高编程的效率,想想之前为了实现每个目标区域像素点的存取操作而使用这个方法都没有很好的解决问题,真后悔没有足够的知识积累,在此记录下来,共勉之。附件下面的资料是在学习list模版类中找到的,以下内容均来自互联网。C++Lists(链表)Lists将元素按顺序储存在链表中.与向量(vectors)相比,它允许快速的插入和删除,但是随机访问却比较慢.assign()给list赋值back()返回最后一个元素begin()返回指向第一个元素的迭代器clear()删除所有元素empty()如果list是空的则返回trueend()返回末尾的迭代器erase()删除一个元素front()返回第一个元素get_allocator()返回list的配置器insert()插入一个元素到list中max_size()返回list能容纳的最大元素数量merge()合并两个listpop_back()删除最后一个元素pop_front()删除第一个元素push_back()在list的末尾添加一个元素push_front()在list的头部添加一个元素rbegin()返回指向第一个元素的逆向迭代器remove()从list删除元素remove_if()按指定条件删除元素rend()指向list末尾的逆向迭代器resize()改变list的大小reverse()把list的元素倒转size()返回list中的元素个数sort()给list排序splice()合并两个listswap()交换两个listunique()删除list中重复的元素附List用法实例:#includeiostream#includelist#includenumeric#includealgorithmusingnamespacestd;//创建一个list容器的实例LISTINTtypedeflistintLISTINT;//创建一个list容器的实例LISTCHARtypedeflistcharLISTCHAR;voidmain(void){//--------------------------//用list容器处理整型数据//--------------------------//用LISTINT创建一个名为listOne的list对象LISTINTlistOne;//声明i为迭代器LISTINT::iteratori;//从前面向listOne容器中添加数据listOne.push_front(2);listOne.push_front(1);//从后面向listOne容器中添加数据listOne.push_back(3);listOne.push_back(4);//从前向后显示listOne中的数据coutlistOne.begin()---listOne.end():endl;for(i=listOne.begin();i!=listOne.end();++i)cout*i;coutendl;//从后向后显示listOne中的数据LISTINT::reverse_iteratorir;coutlistOne.rbegin()---listOne.rend():endl;for(ir=listOne.rbegin();i
本文标题:VC++中list的使用方法总结
链接地址:https://www.777doc.com/doc-2865988 .html