VC++中list的使用方法总结_第1页
VC++中list的使用方法总结_第2页
VC++中list的使用方法总结_第3页
VC++中list的使用方法总结_第4页
VC++中list的使用方法总结_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、这几天在做图像处理方面的研究,其中有一部分是关于图像分割方面的,图像目标在分割出来之后要做进一步的处理,因此有必要将目标图像的信息保存在一个变量里面,一开始想到的是数组,但是马上就发现使用数组的缺点:数组长度固定,动态分配内存很容易导致错误发生。最重要的一点是我要保存目标图像的每一点的坐标值,使用数组就有点无能为力了。因此到百度、Google大神上面找思路,终于被我发现在c+的标准库里面还有这么一个模板类:list,下面就是对找到的资料的汇总和加工。vc6自带的msdn帮助文档的解释以下是引自msdn帮助文档(中文是我自己翻译的,错误之处请包涵。): The template class de

2、scribes an object that controls a varying-length sequence of elements of type T. The sequence is stored as a bidirectional linked list of elements, each containing a member of type T. 本模板类描述了一个对象,这个对象是类型为T的可变长度的序列元素。这个序列采用双向链表的方式存储每一个元素,其中每一个元素的数据流行都是T。 The object allocates and frees storage for the

3、 sequence it controls through a protected object named allocator, of class A. Such an allocator object must have the same external interface as an object of template class allocator. Note that allocatoris not copied when the object is assigned. 对序列对象的分配和释放操作通过一个受保护的对象allocator进行。这样一个allocator对象必须有相同

4、的外部接口作为一个模板类分配器的对象。注意:当对象被分配之后allocator不能被复制。 List reallocation occurs when a member function must insert or erase elements of the controlled sequence. In all such cases, only iterators or references that point at erased portions of the controlled sequence become invalid. 当一个成员要进行insert或者erase操作时,列表

5、的重新分配操作发生。在这种情况下,只有迭代器或者引用所指向的要删除的对象的指针变为无效。msdn帮助文档自带的例子下面为msdn帮助文档中自带的一个例子,该例展示了如何使用迭代器读取列表中的元素和进行插入操作。#include #include using namespace std ;typedef list LISTINT;void main() int rgTest1 = 5,6,7; int rgTest2 = 10,11,12; LISTINT listInt; LISTINT listAnother; LISTINT:iterator i; / Insert one at a ti

6、me listInt.insert (listInt.begin(), 2); listInt.insert (listInt.begin(), 1); listInt.insert (listInt.end(), 3); / 1 2 3 for (i = listInt.begin(); i != listInt.end(); +i) cout *i ; cout endl; / Insert 3 fours listInt.insert (listInt.end(), 3, 4); / 1 2 3 4 4 4 for (i = listInt.begin(); i != listInt.e

7、nd(); +i) cout *i ; cout endl; / Insert an array in there listInt.insert (listInt.end(), rgTest1, rgTest1 + 3); / 1 2 3 4 4 4 5 6 7 for (i = listInt.begin(); i != listInt.end(); +i) cout *i ; cout endl; / Insert another LISTINT listAnother.insert (listAnother.begin(), rgTest2, rgTest2+3); listInt.in

8、sert (listInt.end(), listAnother.begin(), listAnother.end(); / 1 2 3 4 4 4 5 6 7 10 11 12 for (i = listInt.begin(); i != listInt.end(); +i) cout *i ; cout endl;Program Output is:1 2 31 2 3 4 4 41 2 3 4 4 4 5 6 71 2 3 4 4 4 5 6 7 10 11 12list:list模板类的主要函数介绍assign() /给list赋值back() /返回最后一个元素begin() /返回

9、指向第一个元素的迭代器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() /返回指向

10、第一个元素的逆向迭代器remove_if() /按指定条件删除元素remove() /从list删除元素rend() /指向list末尾的逆向迭代器resize() /改变list的大小reverse() /把list的元素倒转size() /返回list中的元素个数sort() /给list排序splice() /合并两个listswap() /交换两个listunique() /删除list中重复的元素常用的操作主要是有插入操作、删除操作。list为实现头尾高效的插入和删除操作而提供了大多数的支持函数,而对于随机访问函数,则只能从头部或者尾部进行遍历操作。关于remove和erase函数上

11、面的介绍中关于插入等等操作都有帮助的例子,但是对于删除函数,这个需要有一些注意的地方。下面请看例子:#include #include #include #include using namespace std;/创建一个list容器的实例LISTINTtypedef list TESTINT;void main() /使用TESTINT创建一个list类型的对象 TESTINT test; /使用TESTINT创建一个迭代器对象 TESTINT:iterator i; /从前面向listOne容器中添加数据 test.push_front (2); test.push_front (1);

12、/从后面向listOne容器中添加数据 test.push_back (3); test.push_back (4); /显示删除前的数据 coutbefore deleteendl; for (i = test.begin(); i != test.end(); +i)cout *i ; coutendl; /从列表中删除一个元素 i = test.begin(); while(i != test.end() int tmp = *i; if(tmp = 2)test.erase(i+);/在这里要是指针前进1个,否则迭代器失效 elsei+; /显示删除后的数据 coutafter del

13、eteendl; for (i = test.begin(); i != test.end(); +i) cout *i ; coutendl;总结 在使用list的时候不能使用随机访问的方式,只能按照迭代的方式进行访问,这样的话在进行删除操作的时候就可能会出现某一次删除操作之后指针没有指向下一个有效的元素而导致迭代器失效。因此,在进行删除操作时候最好使用while的方式,使用for循环如果控制不好,可能会导致迭代器失效。 使用模版类可以极大的提高编程的效率,想想之前为了实现每个目标区域像素点的存取操作而使用这个方法都没有很好的解决问题,真后悔没有足够的知识积累,在此记录下来,共勉之。附件下面

14、的资料是在学习list模版类中找到的,以下内容均来自互联网。C+ Lists(链表)Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.assign() 给list赋值back() 返回最后一个元素begin() 返回指向第一个元素的迭代器clear() 删除所有元素empty() 如果list是空的则返回trueend() 返回末尾的迭代器erase() 删除一个元素front() 返回第一个元素get_allocator() 返回list的配置器insert() 插入一个元素到list中max_size() 返回list能容

15、纳的最大元素数量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() 交换两个li

16、stunique() 删除list中重复的元素附List用法实例:#include #include #include #include using namespace std;/创建一个list容器的实例LISTINTtypedef list LISTINT;/创建一个list容器的实例LISTCHARtypedef list LISTCHAR;void main(void) /- /用list容器处理整型数据 /- /用LISTINT创建一个名为listOne的list对象 LISTINT listOne; /声明i为迭代器 LISTINT:iterator i; /从前面向listOne

17、容器中添加数据 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 ; cout endl; /从后向后显示listOne中的数据LISTINT:reverse_iterator ir;

18、coutlistOne.rbegin()-listOne.rend():endl; for (ir =listOne.rbegin(); ir!=listOne.rend();ir+) cout *ir ; cout endl; /使用STL的accumulate(累加)算法 int result = accumulate(listOne.begin(), listOne.end(),0); coutSum=resultendl; cout-endl; /- /用list容器处理字符型数据 /- /用LISTCHAR创建一个名为listOne的list对象 LISTCHAR listTwo;

19、/声明i为迭代器 LISTCHAR:iterator j; /从前面向listTwo容器中添加数据 listTwo.push_front (A); listTwo.push_front (B); /从后面向listTwo容器中添加数据 listTwo.push_back (x); listTwo.push_back (y); /从前向后显示listTwo中的数据 coutlistTwo.begin()-listTwo.end():endl; for (j = listTwo.begin(); j != listTwo.end(); +j) cout char(*j) ; cout endl;

20、/使用STL的max_element算法求listTwo中的最大元素并显示 j=max_element(listTwo.begin(),listTwo.end(); cout The maximum element in listTwo is: char(*j)endl;#include #include using namespace std;typedef list INTLIST;/从前向后显示list队列的全部元素void put_list(INTLIST list, char *name) INTLIST:iterator plist; cout The contents of na

21、me : ; for(plist = list.begin(); plist != list.end(); plist+) cout *plist ; coutendl;/测试list容器的功能void main(void)/list1对象初始为空 INTLIST list1; /list2对象最初有10个值为6的元素 INTLIST list2(10,6); /list3对象最初有3个值为6的元素 INTLIST list3(list2.begin(),-list2.end(); /声明一个名为i的双向迭代器 INTLIST:iterator i; /从前向后显示各list对象的元素 put

22、_list(list1,list1); put_list(list2,list2); put_list(list3,list3);/从list1序列后面添加两个元素list1.push_back(2);list1.push_back(4);coutlist1.push_back(2) and list1.push_back(4):endl; put_list(list1,list1);/从list1序列前面添加两个元素list1.push_front(5);list1.push_front(7);coutlist1.push_front(5) and list1.push_front(7):e

23、ndl; put_list(list1,list1);/在list1序列中间插入数据list1.insert(+list1.begin(),3,9);coutlist1.insert(list1.begin()+1,3,9):endl; put_list(list1,list1);/测试引用类函数coutlist1.front()=list1.front()endl;coutlist1.back()=list1.back()endl;/从list1序列的前后各移去一个元素list1.pop_front();list1.pop_back();coutlist1.pop_front() and l

24、ist1.pop_back():endl; put_list(list1,list1);/清除list1中的第2个元素list1.erase(+list1.begin();coutlist1.erase(+list1.begin():endl; put_list(list1,list1);/对list2赋值并显示list2.assign(8,1);coutlist2.assign(8,1):endl; put_list(list2,list2);/显示序列的状态信息coutlist1.max_size(): list1.max_size()endl;coutlist1.size(): list

25、1.size()endl;coutlist1.empty(): list1.empty()endl;/list序列容器的运算 put_list(list1,list1); put_list(list3,list3);coutlist3: list3)endl;coutlist1list3: (list1list3)endl;/对list1容器排序list1.sort(); put_list(list1,list1);/结合处理list1.splice(+list1.begin(), list3); put_list(list1,list1); put_list(list3,list3);补充:

26、STL标准函数find进行vector 、list链表查找#include #include #include class examplepublic:example(int val)i = val;bool operator=(example const & rhs)return (i = rhs.i) ? true : false;private:int i;using namespace std;int main(void)vector ve;ve.push_back(1);vector:iterator it;example elem(1);it = find(ve.begin(),

27、ve.end(), elem);coutboolalpha(*it = elem);C+中的vector使用范例一、概述vector是C+标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。例如:/ c语言风格int myHouse100 ;/ 采用vectorvector vecMyHouse(100);当如上定义后,vecMyHouse就可以存放100个int型的数据了。1. 它可以像普通数组一样访问eg: vecMyHouse50

28、= 1024;2. 你可以顺序地向容器中填充数据eg:int i =0 ;for( ;i 25; i+ )vecMyHouse.push_back(1);3. 它还可以动态地改变它的大小,通过下面这条语句实现/ 将容器的大小改为400,这样容器中就可以容纳400个int型数据了eg:vecMyHouse.resize(400);4. 你也可以在容器中装入自定义的数据类型eg:/ 自定义一个classclass Cmyclass;/ 定义一个存放class的容器vector vecMyHouse;5. 你可以在定义容器时为它赋初值/ 定义一个容纳100个int型数据的容器,初值赋为0vector

29、 vecMyHouse(100,0);6. 你可以把一个容器的对象赋值给另外一个容器eg:/ 定义一个容纳100个int型数据的容器,初值赋为0vector vecMyHouse(100,0);/ 定义一个新的容器,内容与上述容器一样vector myVec ;myVec = vecMyHouse;二、 以上是vector容器的简单介绍,下面将详细介绍它的其他功能:1. 为了使用vector,必须在你的头文件中包含下面的代码:#include 2. vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上using std:vector;或者using namespace st

30、d;或者直接在使用vector的代码前加前缀eg:std:vector myHouse;3. vector提供如下函数或操作:下面列举了部分常用的功能/ 定义一个vectorstd:vector c;/ 可以使用的功能c.clear() 移除容器中所有数据。c.empty() 判断容器是否为空。c.erase(pos) 删除pos位置的数据c.erase(beg,end) 删除beg,end)区间的数据c.front() 传回第一个数据。c.insert(pos,elem) 在pos位置插入一个elem拷贝c.pop_back() 删除最后一个数据。c.push_back(elem) 在尾部加

31、入一个数据。c.resize(num) 重新设置该容器的大小c.size() 回容器中实际数据的个数。c.begin() 返回指向容器第一个元素的迭代器c.end() 返回指向容器最后一个元素的迭代器三、下面描述一下什么是迭代器迭代器相当于指针,例如:/ 对于变量而言,使用指针指向对应的变量/ 以后就可以使用 * 加指针来操作该变量了int a = 10;int *p;p = &a;/ 使用指针操作该变量eg: *p = 11; / 操作后a变为 11/ 对于容器,使用迭代器操作容器中对应位置的值/ 当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了/ 定义一个vectorst

32、d:vector myVec;/添加10个元素for(int j =0 ; j10 ; j+)myVec.push_back(j);/ 定义一个迭代器std:vector:iterator p;/ 指向容器的首个元素p = myVec.begin();/ 移动到下一个元素p +;/ 修改该元素赋值*p = 20 ; / 则myVec容器中的第二个值被修改为了20/ 循环扫描迭代器,改变所有的值p = myVec.begin();for( ; p!= myVec.end(); p+ )*p = 50;以上简单讲述了vector的用法,仅供入门之用,谢谢。-1.vector 的数据的存入和输出:#

33、include#include#include using namespace std;void main()int i = 0;vector v;for( i = 0; i 10; i+ )v.push_back( i );/把元素一个一个存入到vector中/对存入的数据清空for( i = 0; i v.size(); i+ )/v.size() 表示vector存入元素的个数cout v i ; /把每个元素显示出来cout endl;/注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。你也可以这样做:vector:iterator iter;for( iter = v.begin(); iter != v.end(); iter+ )cout *iter endl;2. 对于二维vector的定义。1)定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论