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

STL_list容器的更多相关文章

  1. STL源码分析与实现-stl_list容器

    1. stl_list 介绍 今天我们来总结一下stl_List, 通过之前介绍单链表的文章,其实对链表的基本操作已经十分熟悉了,那对于stl_list,无非就是链表结构不一样,至于其中的增删改查的细 ...

  2. STL源代码剖析 容器 stl_list.h

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie list ----------------------------------------- ...

  3. 《STL源代码分析》---stl_list.h读书笔记

    STL在列表list它是一种经常使用的容器.list不连续双向链表在内存,而且是环形. 理解列表如何操作的详细信息,然后.阅读STL名单上的代码是最好的方法. G++ 2.91.57.cygnus\c ...

  4. stl_list.h

    stl_list.h // Filename: stl_list.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ...

  5. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  6. 网页提交中文到WEB容器的经历了些什么过程....

    先准备一个网页 <html><meta http-equiv="Content-Type" content="text/html; charset=gb ...

  7. [Spring]IoC容器之进击的注解

    先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...

  8. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

随机推荐

  1. 干货满满,32个常用 Python 实现,你学废了嘛!

    1. 冒泡排序 lis = [56,12,1,8,354,10,100,34,56,7,23,456,234,-58] def sortport(): for i in range(len(lis)- ...

  2. 深度学习论文翻译解析(十六):Squeeze-and-Excitation Networks

    论文标题:Squeeze-and-Excitation Networks 论文作者:Jie Hu  Li Shen Gang Sun 论文地址:https://openaccess.thecvf.co ...

  3. Angular实战之使用NG-ZORRO创建一个企业级中后台框架(进阶篇)

    前言: 上一篇文章我们讲了如何在创建的Angular项目中快速引入ng-zorro-antd企业中台组件库,并且快速构建后台管理页面框架模板.这一章主要介绍的是如何在创建好的后台管理页面框架的快速生成 ...

  4. maven中pom的结构介绍

    1.自己的坐标 groupId-->artifactId-->version> ` 2.打包方式 jar war pom packaging-->jar/war/pom 3. ...

  5. Linux 时间同步 01 简介

    Linux 时间同步 01 简介 目录 Linux 时间同步 01 简介 时间同步 公共NTP服务器地址及IP 系统时间相关文件 时间同步 大数据产生与处理系统是各种计算设备集群的,计算设备将统一.同 ...

  6. Servlet3.0提供的@WebServlet注解引用参数详情介绍

    Servlet3.0提供的@WebServlet注解: servlet3.0所提供的@webservlet注解,用来将某个类注解为一个servlet类,简化了web.xml上的servlet配置, @ ...

  7. 在 CAP 中使用 AOP ( Castle.DynamicProxy )

    简介 本篇文章主要介绍如何在 CAP 中集成使用 Castle.DynamicProxy,Castle DynamicProxy 是一个用于在运行时动态生成轻量级.NET代理的库.代理对象允许在不修改 ...

  8. DW数据仓库

    https://blog.csdn.net/bjweimengshu/article/details/79256504 from Wikipedia 在计算机科学中,数据仓库(data warehou ...

  9. WPF 调试时拖拽不生效

    WPF窗体代码 <Window x:Class="SerialLabelDemo.Test.Window10" xmlns="http://schemas.micr ...

  10. MySQL45讲:一条update语句是怎样执行的

    首先创建一张表: create table T(ID int primary key,c int); 如果要更新ID=2这行+1:应该这样写 update T set c=c+1 where ID=2 ...