一、概述
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为降序