超详细STL专题一:list

一、概述

STL中,有一个重要的函数--list,理解后可以大大提升编程打代码的效率。

它是一种双向链表,允许快速插入和删除,需要头文件 #include<list> 。

二、结构展示

1、载入

我们可以用以下方式载入list:

int data[5]={1,3,2,6,7};  
list<int> listdata(data, data+5);

也可以用这样的方法直接定义:

建立一个空链表:

list<int>emptyl;

建立一个大小为10的链表(用0充满)的链表:

list<int>l10w0(10);

建立一个大小为8个元素(用6充满)的链表:

list<int>tfille(10,8);

建立一个10w0从开始到结束的链表:

list<int>actlist(tfille.begin(),tfille.end());  

建立一个tfille的复制链表:

list<int>copylist(tfille);

加入申请大小空间为4,又要插入新节点,需要申请新节点,原理如图所示:

2、值的引用

为了方便叙述 以下对 list<int>a(5,3);进行说明;

a.front()、a.back() :对首、末位值进行引用:

int k=a.back();//这里k=3

a.begin()、a.end():返回第一个、最后一个元素的指针(iterator):

q=a.begin();    

list<int>::const_iterator q=a.begin(); 

3、链表的控制

a.clear():将list清空:

a.clear();

a.empty():判断是否为空:

bool i=a.empty();//空即为ture,非空为false

a.erease():删除一个元素或一个区域的元素:

a.erase(a.begin()); //删除一个
a.erase(a.begin(),a.end());//该区间全部删除

a.resize(n):改为只容纳n个元素,超出部分删除,若n长,则超出原部分为0:

a.resize(n);
a.resize(n,m);//超出部分重置为m

 a.push_back()、a.push_front():末端插入,首端插入:

a.push_back(1);//末端加入1
a.push_front(1);//首端加入1

a.pop_back()、a.pop_front():末端删除、首端删除:

a.pop_back();
a.pop_front();

a.assign(n,m):将前n个元素替换为m:

a.assign(n,m);

l.assign(a.begin(),a.end()):将l替换为a:

l.assign(a.begin(),a.end());

a.swap(l):交换a,l两个链表:

a.swap(l);

reverse(a.begin(),a.end()):逆序:

reverse(a.begin(),a.end());

a.remove(n):删除为n的所有元素:

a.remove(7);//删除所有为7的元素

a.insert(        ):插入元素:

a.insert(a.begin(),100);//在开始处插入100这个元素
a.insert(a.begin(),2,100);//在开始处插入2个100
a.insert(a.begin(),l.begin(),l.end());//在a开始处插入b的全部

unique():删除相邻重复元素(需要排序,因为它不会删除不相邻的相同元素):

a.unique(); 

sort():对链表排序,默认升序(可自定义):

a.sort();  //a(1,2,3)
a.sort(great<int>()); //a(3,2,1)

resize():重新定义链表长度:

a.resize(6);//a(1,2,3,0,0,0)用默认值填补
a.resize(6,100);//c1(1,2,3,100,100,100)用指定值填补

l.merge(a):将a链表的数值移到l链表的后面,同时a链表清空:

l.merge(a);   
l.merge(a,greater<int>()); //同上但现l为降序

猜你喜欢

转载自blog.csdn.net/qq_41754350/article/details/81091710