STL_list容器


prtyaa
prtyaa 2023-12-26 19:23:09 52295 赞同 0 反对 0
分类: 资源
一、List简介链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相较于vector的连续线性空间,list的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list永远是常数时间。List和vector是两个最常被使用的容器。list容器是一个双向链表容器,可高效地进行插入删除元素。list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。#include 二、list对象的默认构造list采用采用模板类实现,对象的默认构造形式:list LIST; 如: list lstInt; //定义一个存放int的list容器。 list lstFloat; //定义一个存放float的list容器。 list lstString; //定义一个存放string的list容器。 //尖括号内还可以设置指针类型或自定义类型。三、list头尾的添加移除操作list.push_back(elem); //在容器尾部加入一个元素list.pop_back(); //删除容器中最后一个元素list.push_front(elem); //在容器开头插入一个元素list.pop_front(); //从容器开头移除第一个元素 list lstInt; lstInt.push_back(1); lstInt.push_back(3); lstInt.push_back(5); lstInt.push_back(7); lstInt.push_back(9); lstInt.pop_front(); lstInt.pop_front(); lstInt.push_front(11); lstInt.push_front(13); lstInt.pop_back(); lstInt.pop_back(); // lstInt {13,11,5}四、list的数据存取list.front(); //返回第一个元素。list.back(); //返回最后一个元素。 list lstInt; lstInt.push_back(1); lstInt.push_back(5); lstInt.push_back(9); ​ int iFront = lstInt.front(); //1 int iBack = lstInt.back(); //9五、list与迭代器list.begin(); //返回容器中第一个元素的迭代器。list.end(); //返回容器中最后一个元素之后的迭代器。list.rbegin(); //返回容器中倒数第一个元素的迭代器。list.rend(); //返回容器中倒数最后一个元素的后面的迭代器。 for (list::iterator it=lstInt.begin(); it!=lstInt.end(); ++it) { cout << *it< mlist1; list mlist2(10, 10); //有参构造 list mlist3(mlist2);//拷贝构造 list mlist4(mlist2.begin(), mlist2.end()); ​ for (list::iterator it = mlist4.begin(); it != mlist4.end(); it++) { cout << *it << " "; } cout << endl; /* 结果: 10 10 10 10 10 10 10 10 10 10 */七、list的赋值list.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。list.assign(n,elem); //将n个elem拷贝赋值给本身。list& operator=(const list &lst); //重载等号操作符list.swap(lst); // 将lst与本身的元素互换。 list lstIntA,lstIntB,lstIntC,lstIntD; lstIntA.push_back(1); lstIntA.push_back(5); lstIntA.push_back(9); ​ lstIntB.assign(lstIntA.begin(),lstIntA.end()); //1 5 9 lstIntC.assign(5,8); //8 8 8 8 8 lstIntD = lstIntA; //1 5 9 lstIntC.swap(lstIntD); //互换 八、list的大小list.size(); //返回容器中元素的个数list.empty(); //判断容器是否为空list.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。list.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。 list lstIntA; lstIntA.push_back(11); lstIntA.push_back(33); lstIntA.push_back(55); ​ if (!lstIntA.empty()) { int iSize = lstIntA.size(); //3 lstIntA.resize(5); //11 33 55 0 0 lstIntA.resize(7,1); //11 33 55 0 0 1 1 lstIntA.resize(2); //11 33 }九、list的插入list.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。list.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。list.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。 list lstA; list lstB; ​ lstA.push_back(1); lstA.push_back(5); lstA.push_back(9); ​ lstB.push_back(2); lstB.push_back(6); ​ lstA.insert(lstA.begin(), 11); //{11, 1, 5, 9} lstA.insert(++lstA.begin(),2,33); //{11,33,33,1,5,9} lstA.insert(lstA.begin() , lstB.begin() , lstB.end() ); //{2,6,11,33,33,1,5,9}十、list的删除list.clear(); //移除容器的所有数据list.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。list.erase(pos); //删除pos位置的数据,返回下一个数据的位置。lst.remove(elem); //删除容器中所有与elem值匹配的元素。 //删除区间内的元素 //lstInt是用list声明的容器,现已包含按顺序的1,3,5,6,9元素。 list::iterator itBegin=lstInt.begin(); ++ itBegin; list::iterator itEnd=lstInt.begin(); ++ itEnd; ++ itEnd; ++ itEnd; lstInt.erase(itBegin,itEnd); //此时容器lstInt包含按顺序的1,6,9三个元素。 ​ //假设 lstInt 包含1,3,2,3,3,3,4,3,5,3,删除容器中等于3的元素的方法一 for(list::iterator it=lstInt.being(); it!=lstInt.end(); ) //小括号里不需写 ++it { if(*it == 3){ it = lstInt.erase(it); //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。 //此时,不执行 ++it; } else{ ++it; } } ​ //删除容器中等于3的元素的方法二 lstInt.remove(3); ​ //删除lstInt的所有元素 lstInt.clear(); //容器为空十一、list的反序排列lst.reverse(); //反转链表 list lstA; lstA.push_back(1); lstA.push_back(3); lstA.push_back(5); lstA.push_back(7); lstA.push_back(9); ​ lstA.reverse(); //9 7 5 3 1容器

一、List简介

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

链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

相较于vector的连续线性空间,list的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list永远是常数时间。

List和vector是两个最常被使用的容器。

list容器是一个双向链表容器,可高效地进行插入删除元素。

list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。

#include <list>

二、list对象的默认构造

list采用采用模板类实现,对象的默认构造形式:list<T> LIST; 如:

 list<int> lstInt;      //定义一个存放int的list容器。
 list<float> lstFloat;   //定义一个存放float的list容器。
 list<string> lstString;   //定义一个存放string的list容器。              
 //尖括号内还可以设置指针类型或自定义类型。

 

三、list头尾的添加移除操作

list.push_back(elem); //在容器尾部加入一个元素

list.pop_back(); //删除容器中最后一个元素

list.push_front(elem); //在容器开头插入一个元素

list.pop_front(); //从容器开头移除第一个元素

     list<int> lstInt;
     lstInt.push_back(1);
     lstInt.push_back(3);
     lstInt.push_back(5);
     lstInt.push_back(7);
     lstInt.push_back(9);
     lstInt.pop_front();
     lstInt.pop_front();
     lstInt.push_front(11);
     lstInt.push_front(13);
     lstInt.pop_back();
     lstInt.pop_back();
 // lstInt    {13,11,5}

 

四、list的数据存取

list.front(); //返回第一个元素。

list.back(); //返回最后一个元素。

     list<int> lstInt;
     lstInt.push_back(1);
     lstInt.push_back(5);
     lstInt.push_back(9);
 
     int iFront = lstInt.front();    //1
     int iBack = lstInt.back();      //9

 

五、list与迭代器

list.begin(); //返回容器中第一个元素的迭代器。

list.end(); //返回容器中最后一个元素之后的迭代器。

list.rbegin(); //返回容器中倒数第一个元素的迭代器。

list.rend(); //返回容器中倒数最后一个元素的后面的迭代器。

 for (list<int>::iterator it=lstInt.begin(); it!=lstInt.end(); ++it) {
         cout << *it<<cout << " ";
     }

 

六、list对象的带参数构造

list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。

list(n,elem); //构造函数将n个elem拷贝给本身。

list(const list &lst); //拷贝构造函数。

     list<int> mlist1;
     list<int> mlist2(10, 10); //有参构造
     list<int> mlist3(mlist2);//拷贝构造
     list<int> mlist4(mlist2.begin(), mlist2.end());
 
     for (list<int>::iterator it = mlist4.begin(); it != mlist4.end(); it++) {
         cout << *it << " ";
     }
     cout << endl;
 /*
 结果:
 10 10 10 10 10 10 10 10 10 10
 */

 

七、list的赋值

list.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。

list.assign(n,elem); //将n个elem拷贝赋值给本身。

list& operator=(const list &lst); //重载等号操作符

list.swap(lst); // 将lst与本身的元素互换。

     list<int> lstIntA,lstIntB,lstIntC,lstIntD;
     lstIntA.push_back(1);
     lstIntA.push_back(5);
     lstIntA.push_back(9);
 
     lstIntB.assign(lstIntA.begin(),lstIntA.end());      //1 5 9
     lstIntC.assign(5,8);                            //8 8 8 8 8
     lstIntD = lstIntA;                          //1 5 9
     lstIntC.swap(lstIntD);                      //互换

八、list的大小

list.size(); //返回容器中元素的个数

list.empty(); //判断容器是否为空

list.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

list.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

     list<int> lstIntA;
     lstIntA.push_back(11);
     lstIntA.push_back(33);
     lstIntA.push_back(55);
 
     if (!lstIntA.empty())
     {
         int iSize = lstIntA.size();     //3
         lstIntA.resize(5);          //11 33 55 0 0
         lstIntA.resize(7,1);            //11 33 55 0 0 1 1
         lstIntA.resize(2);          //11 33
     }

 

九、list的插入

list.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

list.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

list.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。

     list<int> lstA;
     list<int> lstB;
 
     lstA.push_back(1);
     lstA.push_back(5);
     lstA.push_back(9);
 
     lstB.push_back(2);
     lstB.push_back(6);
 
     lstA.insert(lstA.begin(), 11);      //{11, 1, 5, 9}
     lstA.insert(++lstA.begin(),2,33);       //{11,33,33,1,5,9}
     lstA.insert(lstA.begin() , lstB.begin() , lstB.end() ); //{2,6,11,33,33,1,5,9}

 

十、list的删除

list.clear(); //移除容器的所有数据

list.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。

list.erase(pos); //删除pos位置的数据,返回下一个数据的位置。

lst.remove(elem); //删除容器中所有与elem值匹配的元素。

 //删除区间内的元素
 //lstInt是用list<int>声明的容器,现已包含按顺序的1,3,5,6,9元素。
 list<int>::iterator itBegin=lstInt.begin();
 ++ itBegin;
 list<int>::iterator itEnd=lstInt.begin();
 ++ itEnd;
 ++ itEnd;
 ++ itEnd;
 lstInt.erase(itBegin,itEnd);
 //此时容器lstInt包含按顺序的1,6,9三个元素。
 
 //假设 lstInt 包含1,3,2,3,3,3,4,3,5,3,删除容器中等于3的元素的方法一
 for(list<int>::iterator it=lstInt.being(); it!=lstInt.end(); )    //小括号里不需写  ++it
 {
    if(*it == 3){
         it  =  lstInt.erase(it);       //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。
          //此时,不执行  ++it;  
    }
    else{
        ++it;
    }
 }
 
 //删除容器中等于3的元素的方法二
 lstInt.remove(3);
 
 //删除lstInt的所有元素
 lstInt.clear();         //容器为空

 

十一、list的反序排列

lst.reverse(); //反转链表

     list<int> lstA;
     
     lstA.push_back(1);
     lstA.push_back(3);
     lstA.push_back(5);
     lstA.push_back(7);
     lstA.push_back(9);
 
     lstA.reverse();         //9 7 5 3 1

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  125
统信桌面专业版【全盘安装UOS系统】介绍  120
银河麒麟桌面操作系统安装佳能打印机驱动方法  111
银河麒麟桌面操作系统 V10-SP1用户密码修改  105
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益209.03元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!