C++:List容器

一、List概述

需要头文件#include <list>

list容器是用来构造一个链表的,而且构造的链表是双向的(即val数据域,next指针和prve指针)。用List构造的链表有一个虚拟头节点,并且链表最后一个结点的next指针指向虚拟头节点,虚拟头节点的prve指针指向最后一个结点,也就是循环双向链表

list中还有两个迭代器,即begin()和end(),例如list<inr>  l;  l.begin()就是虚拟头节点,而l.end()就是尾结点。

 

二、List容器的基本操作

1、初始化:

list<数据类型>  数据名;

当不做赋值操作时,list为空

2、初始化赋值操作:

显性赋值:list<int>  l={1,2,3,4,5};

隐性赋值:list<int>  l({1,2,3,4,5});

//以上两种操作结果相同;

已经用List创建了一个链表,并且想创建一个新的链表与原链表相同时:

list<int>  l2(l1.begin(),l1.end());   //此时l1和l2相同

全零初始化:list<int>  l(想要为零的个数);  //例如list<int> l(8);

有值初始化:list<int>  l(初始化个数,初始化数字);  //例如list<int>  l(8,6);

拷贝构造函数:list<int>  l(与l相同的List对象);//例如list<int>  l(l1);

三、赋值操作

假设l={9,8,5,2,1,1};

“=”赋值:List<int>  l1;  l1=l;

assign赋值:assign(迭代器):list<int>  l2;  l2.assign(l.begin(),l.end());

assign有两种初始化方式:

        初始化列表:list<int>  l3;   l3.assign({1,3,1,4});

        初始化a个b:list<int>  l4;   l4.assign(a,b);

四、List大小操作

empty:list判空操作,空为1,不空为0。

size:list大小判断,l.size()输出链表大小;

resize:list补充,保留原List中的数据,将未满足数量的数据初始化为0;

例如:list<int>  l;

           l.assign({1,2,3});

           l.resize(18);

最终输出:1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

//resize也支持初始化不为零的数,resize(数据数量,数据值),最终为保持前面的不变,后面初始化为相应的值。

当resize扩大的数据量小于原链表,则会减少为相应数量。

五、数据插入

1、push_front:头插

头插法相当于逆序建表,例如l.push_front(1);

                                              l.push_front(2);

                                              l.push_front(3);

最终输出:3 2 1

2、push_back:尾插

尾插法相当于顺序建表,例如l.push_front(1);

                                              l.push_front(2);

                                              l.push_front(3);

最终输出:1 2 3

3、insert:中间插

方法一:insert(迭代器,值);  即在迭代器所在的位置插入一个值。

迭代器:list<int>::iterator  it=l.begin();  此时可以it++,但不能it=it+1;(链表不支持随机访问,有可能你不会加1)

如果迭代器是begin+3,则插在第四个位置,相当于l[3];

方法二:insert(迭代器,数量,值);  在迭代器插入一定数量的值。

方法三:insert(迭代器,迭代器的开始位置,迭代器的结束位置);例如

                        list<int> l={1,2,3};

                        it=l.begin();

                        it++;

                        insert(it,l.begin(),l.end());

最终输出:1 1 2 3 2 3  (蓝色部分就是l起始位置到终止位置的拷贝)

六、数据删除

list<int>  l={1,2,3};

1、pop_front:头删;

例如:l.pop_front();  输出 2 3

2、pop_back:尾删;

例如:l.pop_back():输出 1 2

3、erase:中间删;

有两种形式:

        l.erase(迭代器);//注意,这个有返回值,可以用一个迭代器接住,迭代器指向第一个数。

        l.erase(开始的迭代器,结束的迭代器);

例如list<int>::iterator it=l.rease(l.begin());   

(蓝色字体可以认为是链表类型的数据类型,相当于对于整数类型的int)

或者  it=erase(it);

4、clear:全部清除;

七、数据访问

list<int>  l={1,2,3};

//List无法进行随机访问,效率低,所以数组方式或者at方式都不行;

所以,只能从头开始一个一个去寻找

定义链表类型的迭代器list<int> ::iterator  it=l.begin();通过 it++ 来寻找符合题意的数据。

八、链表反转

l.reverse();  直接实现链表内部的反转。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值