VC++中listlist的使用方法总结

  • 格式:docx
  • 大小:34.07 KB
  • 文档页数:14

以下是引自msdn帮助文档(中文是我自己翻译的,错误之处请包涵。

):The template class describes 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 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 templateclass allocator. Note that allocator is not copied when the object is assigned.对序列对象的分配和释放操作通过一个受保护的对象allocator进行。

这样一个allocator对象必须有相同的外部接口作为一个模板类分配器的对象。

注意:当对象被分配之后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 sequencebecome invalid.当一个成员要进行insert或者erase操作时,列表的重新分配操作发生。

在这种情况下,只有迭代器或者引用所指向的要删除的对象的指针变为无效。

msdn帮助文档自带的例子下面为msdn帮助文档中自带的一个例子,该例展示了如何使用迭代器读取列表中的元素和进行插入操作。

#include <list>#include <iostream>using namespace std ;typedef list<int> LISTINT;void main(){int rgTest1[] = {5,6,7};int rgTest2[] = {10,11,12};LISTINT listInt;LISTINT listAnother;LISTINT::iterator i;// Insert one at a timelistInt.insert (listInt.begin(), 2);listInt.insert (listInt.begin(), 1);listInt.insert (listInt.end(), 3);// 1 2 3for (i = listInt.begin(); i != listInt.end(); ++i)cout << *i << "";cout << endl;// Insert 3 fourslistInt.insert (listInt.end(), 3, 4);// 1 2 3 4 4 4for (i = listInt.begin(); i != listInt.end(); ++i)cout << *i << "";cout << endl;// Insert an array in therelistInt.insert (listInt.end(), rgTest1, rgTest1 + 3);// 1 2 3 4 4 4 5 6 7for (i = listInt.begin(); i != listInt.end(); ++i)cout << *i << "";cout << endl;// Insert another LISTINTlistAnother.insert (listAnother.begin(), rgTest2, rgTest2+3);listInt.insert (listInt.end(), listAnother.begin(), listAnother.end());// 1 2 3 4 4 4 5 6 7 10 11 12for (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() //返回指向第一个元素的迭代器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函数上面的介绍中关于插入等等操作都有帮助的例子,但是对于删除函数,这个需要有一些注意的地方。

下面请看例子:#include <iostream>#include <list>#include <numeric>#include <algorithm>using namespace std;//创建一个list容器的实例LISTINTtypedef list<int> TESTINT;void main(){//使用TESTINT创建一个list类型的对象TESTINT test;//使用TESTINT创建一个迭代器对象TESTINT:iterator i;//从前面向listOne容器中添加数据test.push_front (2);test.push_front (1);//从后面向listOne容器中添加数据test.push_back (3);test.push_back (4);//从列表中删除一个元素i = test.begin();while(i != test.end()){int tmp = *i;if(tmp == 2){test.erase(i++);//在这里要是指针前进1个,否则迭代器失效}else{i++;}}}总结在使用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用法实例:#include <iostream>#include <list>#include <numeric>#include <algorithm>using namespace std;//创建一个list容器的实例LISTINTtypedef list<int> LISTINT;//创建一个list容器的实例LISTCHARtypedef list<char> LISTCHAR;void main(void){//--------------------------//用list容器处理整型数据//--------------------------//用LISTINT创建一个名为listOne的list对象LISTINT listOne;//声明i为迭代器LISTINT::iterator i;//从前面向listOne容器中添加数据listOne.push_front (2);listOne.push_front (1);//从后面向listOne容器中添加数据listOne.push_back (3);listOne.push_back (4);//从前向后显示listOne中的数据cout<<"listOne.begin()--- listOne.end():"<<endl;for (i = listOne.begin(); i != listOne.end(); ++i)cout << *i << " ";cout << endl;//从后向后显示listOne中的数据LISTINT::reverse_iterator ir;cout<<"listOne.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); cout<<"Sum="<<result<<endl;cout<<"------------------"<<endl;//--------------------------//用list容器处理字符型数据//--------------------------//用LISTCHAR创建一个名为listOne的list对象LISTCHAR listTwo;//声明i为迭代器LISTCHAR::iterator j;//从前面向listTwo容器中添加数据listTwo.push_front ('A');listTwo.push_front ('B');//从后面向listTwo容器中添加数据listTwo.push_back ('x');listTwo.push_back ('y');//从前向后显示listTwo中的数据cout<<"listTwo.begin()---listTwo.end():"<<endl;for (j = listTwo.begin(); j != listTwo.end(); ++j)cout << char(*j) << " ";cout << endl;//使用STL的max_element算法求listTwo中的最大元素并显示 j=max_element(listTwo.begin(),listTwo.end());cout << "The maximum element in listTwo is: "<<char(*j)<<endl; }#include <iostream>#include <list>using namespace std;typedef list<int> INTLIST;//从前向后显示list队列的全部元素void put_list(INTLIST list, char *name){INTLIST::iterator plist;cout << "The contents of " << name << " : ";for(plist = list.begin(); plist != list.end(); plist++)cout << *plist << " ";cout<<endl;}//测试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_list(list1,"list1");put_list(list2,"list2");put_list(list3,"list3");//从list1序列后面添加两个元素list1.push_back(2);list1.push_back(4);cout<<"list1.push_back(2) and list1.push_back(4):"<<endl;put_list(list1,"list1");//从list1序列前面添加两个元素list1.push_front(5);list1.push_front(7);cout<<"list1.push_front(5) and list1.push_front(7):"<<endl;put_list(list1,"list1");//在list1序列中间插入数据list1.insert(++list1.begin(),3,9);cout<<"list1.insert(list1.begin()+1,3,9):"<<endl;put_list(list1,"list1");//测试引用类函数cout<<"list1.front()="<<list1.front()<<endl;cout<<"list1.back()="<<list1.back()<<endl;//从list1序列的前后各移去一个元素list1.pop_front();list1.pop_back();cout<<"list1.pop_front() and list1.pop_back():"<<endl; put_list(list1,"list1");//清除list1中的第2个元素list1.erase(++list1.begin());cout<<"list1.erase(++list1.begin()):"<<endl;put_list(list1,"list1");//对list2赋值并显示list2.assign(8,1);cout<<"list2.assign(8,1):"<<endl;put_list(list2,"list2");//显示序列的状态信息cout<<"list1.max_size(): "<<list1.max_size()<<endl; cout<<"list1.size(): "<<list1.size()<<endl;cout<<"list1.empty(): "<<list1.empty()<<endl;//list序列容器的运算put_list(list1,"list1");put_list(list3,"list3");cout<<"list1>list3: "<<(list1>list3)<<endl;cout<<"list1<list3: "<<(list1<list3)<<endl;//对list1容器排序list1.sort();put_list(list1,"list1");//结合处理list1.splice(++list1.begin(), list3);put_list(list1,"list1");put_list(list3,"list3");}补充:STL标准函数find进行vector 、list链表查找#include <vector>#include <algorithm>#include <iostream>class example{public: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<example> ve;ve.push_back(1);vector<example>::iterator it;example elem(1);it = find(ve.begin(), ve.end(), elem);cout<<boolalpha<<(*it == elem);}C++中的vector使用范例一、概述vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。