所在的位置: C++ >> C++前景 >> C编程语言C的list容器链

C编程语言C的list容器链

1.list容器链表基本概念

功能:将数据进行链式存储

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针连接实现的

链表的组成:链表是由一些列节点组成

节点的组成:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域

STL中的链表是一个双向循环链表

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

list的优点:

采用动态存储分配,不会造成内存浪费和溢出

链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list的缺点:

list链表遍历速度不快,同时占用空间大

List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,者在vector是不成立的2.

2.list构造函数

/*函数原型listtlist采用模板实现默认构造list(beg,end)构造函数将[beg,end]区间的元素拷贝给本身list(n,elem)构造函数将n个elem拷贝给本身list(constlistlst)拷贝构造函数*/voidprintList(constlistintL){for(listint::const_iteratorit=L.begin();it!=L.end();it++){cout*itendl;}}voidtest01(){//创建list容器listintL1;//默认构造//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//遍历listprintList(L1);//区间方式构造listintL2(L1.begin(),L1.end());printList(L2);//拷贝构造listintL3(L2);printList(L2);}intmain(){test01();system("pause");return0;}

3.list赋值和交换

功能描述:给list容器进行赋值以及交换list容器

/*函数原型assign(beg,end)将[beg,end]区间中的数据拷贝赋值给本身assign(n,elem)将n个elem拷贝赋值给本身listoperator=(constlistlst)重载等号swap(lst)将lst与本身的元素互换*/voidprintList(constlistintL){for(listint::const_iteratorit=L.begin();it!=L.end();it++){cout*it"";}coutendl;}voidtest01(){//创建list容器listintL1;//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//遍历list//printList(L1);//赋值操作listintL2;L2=L1;//以等号的方式赋值//printList(L2);listintL3;L3.assign(L2.begin(),L3.end());//assign(beg,end)printList(L3);listintL4;L4.assign(2,5);//assign(n,elem)printList(L4);//交换L4.swap(L3);printList(L4);printList(L3);}intmain(){test01();system("pause");return0;}

4.list容器大小操作和元素数判断

功能描述:

对list容器的大小进行操作

/*函数原型size();返回容器中元素的个数empty();判断容器是否为空resize(num)重新指定容器的长度为num若容器变长,则以默认值(一般为0)填充新位置如果容器变短,则末尾超出容器长度的元素被删除resize(num,elem)重新指定容器的长度为num,若容器变长,则以elem值填充新位置如果容器变短,则末尾超出容器长度的元素被删除*/voidprintList(constlistintL){for(listint::const_iteratorit=L.begin();it!=L.end();it++){cout*it"";}coutendl;}voidtest01(){//创建list容器listintL1;//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//遍历listprintList(L1);//判断容器是否为空if(L1.empty()){cout"L1为空"endl;}else{cout"L1不为空"endl;cout"L1的元素个数为:"L1.size()endl;}//重新指定大小L1.resize(10);printList(L1);//输出:00L1.resize(2);printList(L1);//输出:}intmain(){test01();system("pause");return0;}

5.list插入和删除

功能描述:对list容器进行数据的插入和删除

/*函数原型push_back(elem)在容器尾部加入一个元素pop_back()删除容器中最后一个元素push_front(elem)在容器开头插入一个元素pop_front()从容器开头移除第一个元素erase(beg,end)删除[beg,end]区间的数据,返回下一个数据的位置erase(pos)删除pos位置的数据返回下一个数据的位置clear()移除容器中的所有数据remove(elem)删除容器中所有与elem值匹配的元素插入insert(pos,elem)在pos位置插入elem元素的拷贝,返回新数据位置insert(pos,n,elem)在pos位置插入n个elem数据,无返回值insert(pos,beg,end)在pos位置插入[beg,end]区间的数据无返回值*/voidprintList(constlistintL){for(listint::const_iteratorit=L.begin();it!=L.end();it++){cout*it"";}coutendl;}voidtest01(){//创建list容器listintL1;//尾插L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//头插L1.push_front();L1.push_front();L1.push_front();L1.push_front();//遍历listprintList(L1);//输出;3040//尾删L1.pop_back();printList(L1);//输出;30//头删L1.pop_front();printList(L1);//输出;30//insert插入L1.insert(L1.begin(),0);printList(L1);//输出;//可以使用迭代器偏移listint::iteratorit=L1.begin();L1.insert(++it,);printList(L1);//输出;0500//删除L1.erase(L1.end());printList(L1);//输出;500L1.remove(10);printList(L1);//输出;2}intmain(){test01();system("pause");return0;}

6.list数据存取

功能描述:

对list容器中数据进行存取

/*函数原型front()返回第一个元素back()返回最后一个元素*/voidtest01(){//创建list容器listintL1;//尾插L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//L1[0]不可以使用[]方式访问list容器中的元素//L1.at(0)不可以使用at方式访问list容器中的元素//原因是list本质是链表,不是用连续性空间存储数据,迭代器也是不支持随机访问cout"第一个元素为:"L1.front()endl;cout"最后一个元素为:"L1.back()endl;//验证迭代器是不支持随机访问的listint::iteratorit=L1.begin();it++;//支持双向it--;//it=it+2;报错是不支持随机访问的}intmain(){test01();system("pause");return0;}

7.list反转和排序

功能描述:

将容器中的元素反转,以及将容器中的数据进行排序

/*函数原型reverse()反转链表sort()链表排序*///打印函数voidprintList(listintL){for(listint::iteratorit=L.begin();it!=L.end();it++){cout*it"";}coutendl;}//降序排序所需函数boolmyCompare(intv1,intv2){returnv1v2;}voidtest01(){//创建list容器listintL1;//尾插L1.push_back(30);L1.push_back(20);L1.push_back(50);L1.push_back(40);//反转前printList(L1);//反转后L1.reverse();printList(L1);//排序//sort(L1.begin(),L1.end());报错//原因所有不支持随机访问迭代器的容器,不可以使用标准算法//不支持随机访问迭代器的容器,内部会提供对应一些算法,同时排序还可以实现降序L1.sort();//此时是增序printList(L1);L1.sort(myCompare);//此时是实现降序printList(L1);}intmain(){test01();system("pause");return0;}

8.list排序案例

案例描述:将Person自定义数据类型进行排序,Person中属性有姓名,年龄,身高

排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序

//list容器排列案例对于自定义数据类型做排序//规则:按照年龄进行升序,如果年龄相同按照身高进行降序classPerson{public:stringm_Name;intm_Age;intm_Height;Person(stringname,intage,intheight){this-m_Name=name;this-m_Age=age;this-m_Height=height;}};//排序规则函数bool


转载请注明:http://www.aierlanlan.com/cyrz/5623.html

  • 上一篇文章:
  •   
  • 下一篇文章: