STL_list容器

一、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)

相关推荐

  • STL_deque容器

    一.deque简介 deque是"double-ended queue"的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口 ...

  • STL_常用的算法

    STL_常用的算法 一.常用的查找算法 adjacent_find() adjacent_find(iterator beg, iterator end, _callback); 在iterator对 ...

  • C++各类容器的用法和区别

    准模板库就是类与函数模板的大集合.STL共有6种组件:容器,容器适配器,迭代器,算法,函数对象和函数适配器:vector封装数组,list封装了链表,map和set封装了二叉树. 一.序列容器: Li ...

  • 欧标容器板20MnMoNi4-5性能,20MnMoNi4-5回火温度

    1.20MnMoNi4-5是欧标压力容器用钢板2.20MnMoNi4-5交货状态:淬火+回火,回火温度:610-690℃3.20MnMoNi4-5执行标准:EN10028-2-20094.20MnMo ...

  • 中低温压力容器板07Cr2AlMoR交货状态

    1.07Cr2AlMoR属于中低温压力容器钢板2.07Cr2AlMoR交货状态:正火+回火或淬火+回火3.07Cr2AlMoR执行标准:GB/T713-20144.07Cr2AlMoR化学成分牌号化学 ...

  • 《C++ Primer》笔记 第9章 顺序容器

    顺序容器类型 类型 解释 vector 可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 deque 双端队列.支持快速随机访问.在头尾位置插入.删除速度很快 list 双向链表 ...

  • 中低温焊接容器板SA612M性能分析

    SA612M是一种中低温焊接压力容器用镇静C-Mn-Si钢板 其主要技术条件如下 一.适用范围 本技术协议适用于最大厚度25mm的中低温焊接压力容器用镇静C-Mn-Si钢板的生产及检验. 二.SA61 ...

  • Azure上的Java:监视和扩展容器化的应用程序

    了解应用程序的运行状况至关重要.如果您的服务不可用,则可能会降低生产力并延误其他流程.您可以通过多种方式跟踪应用程序的可用性.AzureMonitor提供了一种收集和分析有关应用程序性能和事件的信息的 ...

  • 焊接(多层)压力容器用淬火加回火碳锰硅钢板SA724GrA性能

    焊接(多层)压力容器用淬火加回火碳锰硅钢板1. 适用范围SA724GrA  SA724GrB  SA724GrC生产C级钢时可添加硼.钢板都应经淬火加回火处理,主要用于焊制多层压力容器.SA724Gr ...

  • 创建用于AI和机器学习的Docker容器

    容器技术(例如Docker)极大地简化了依赖性管理和软件的可移植性.在本系列文章中,我们将探讨Docker在机器学习(ML)场景中的用法. 本系列假定您熟悉ML,一般的容器化,尤其是Docker.欢迎 ...

  • 在启用GPU的Docker容器中运行AI模型

    容器技术(例如Docker)极大地简化了依赖性管理和软件的可移植性.在本系列文章中,我们将探讨Docker在机器学习(ML)场景中的用法. 本系列假定您熟悉ML,一般的容器化,尤其是Docker.欢迎 ...

  • 欧标容器板15NiCuMoNb5-6-4性能

    一.15NiCuMoNb5-6-4简介15NiCuMoNb5-6-4钢板属于欧洲压力容器用钢板,用于制造反应器.换热器.分离器.球罐.油气罐.液化气罐.核能反应堆压力壳.液化石油汽瓶.水轮机蜗壳等.二 ...