2.list
STL中的list是一个双向链表,可以从头到尾或从尾到头访问链表中的结点,结点可以是任意数据类型。链表中节点的访问尝尝通过迭代器进行。可用front成员函数找到list的第一个元素,用back找到list的最后一个元素。迭代器iterator用于指向链表的节点,通过它可以遍历整个链表。
(1)链表的构造(模板参数T时链表的数据类型)
list<T> c //建立一个空链表c
list<T> c1(c2) //建立与c2同型的链表c1(c2的每个元素都被复制)
list<T> c(n) //建立具有n个元素的链表c,元素值由默认构造函数产生
list<T> c(n,e) //建立n个元素的链表c,每个元素都是e
list<T> c(beg,end) //建立一个链表c,并用[beg,end]区间的元素作初始化
c.~list<e>() //销毁链表c,释放内存
(2)链表赋值
c1=c2 //将c2链表的全部元素赋值给c1链表
c1.assign(n,e) //将元素e复制n次到c1链表
c.assign(beg,end) //将区间[beg,end]的元素赋值给c
c1.swap(c2) //将链表c1和c2的全部互换
(3)链表存取
c.front() //返回第一个元素,不检查元素存在与否
c,back() //返回最后一个元素,不检查元素存在与否
(4)链表的插入和删除
c.insert(pos,e) //在pos位置插入元素e的副本,并返回新元素的位置
c.issert(pos,n,e) //在pos位置插入元素e的n个副本,没有返回值
c.insert(pos,beg,end) 在pos位置插入区间[beg,end]内的全部元素
c.push_back(e) //在尾部追加一个元素e的副本
c.pop_back(e) //删除最后一个元素
c.push_front(e) //在表头插入一个元素e的副本
c.pop_front() //删除第一个元素
c.remove(val) //删除值为val的元素
c.remove_if(op) //删除所有"造成op(e)结果为true"的元素
c.erase(pos) //删除pos指向的元素,返回下一个元素的位置
c.erase(beg,end) //删除区间[beg,end]内的元素,返回下一元素的位置
c.resize(n) //将链表c的大小重新设置为n
c.clear() //删除链表所有元素,将整个容器置空
(5)链表的特殊操作
c.unique() //若存在多个相邻且值相等的元素,则删除重复元素,只留一个
c.unique(op) //若存在若干相邻且使op()操作为true的元素,则删除重复,只留一个
c1.splice(pos,c2) //将c2内的所有元素转换到c1内,pos之前
c1.splice(pos,c2,c2pos) //将c2链表的c2pos所指元素移到c1内的pos指向的位置
c1.splice(pos,c2,c2beg,c2end) //将c2内[beg,end]区间的所有元素转换到c1内pos前
c.sort() //以operator<为准则,对所有元素排序
c.sort(op) //以op()为准则面对所有元素排序
c1.merge(c2) //c2中的全部元素合并到c1,若c1,c2都已排序,则合并侯list仍有序
c.rev erve() //将所有元素反序
说明:op可以是less<>或greater<>之一,应用时需在<>中写上类型。
简例:
#include<bits/stdc++.h>
using namespace std;
int main()
{
list<int> L1,L2;
int a1[]={100,90,80,70,60};
int a2[]={30,40,50,60,60,60,80};
for(int i=0;i<5;i++)
L1.push_back(a1[i]);
for(int i=0;i<7;i++)
L2.push_back(a2[i]);
L1.reverse(); //将L1链表倒序
L1.merge(L2); //将L2合并到L1链表中
cout<<"L1的元素个数为:"<<L1.size()<<endl;
L1.unique(); //删除L1中相邻位置的元素
while(!L1.empty()){
cout<<L1.front()<<" ";
L1.pop_front();
}
return 0;
}