STL list 是一个双向链表,迭代器具备前移和后移的能力。list 有一个重要的性质:插入操作和结合操作会造成原有的迭代器失效。
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
void Show(int nValue)
{
cout << nValue << " ";
}
int main()
{
list<int> lis(5,10);//创建一个链表,链表具有五个节点,每个节点初始化为10;
list<int>::iterator ite=lis.begin();
//链表因为是不连续的所以不能跟数组一样用下标遍历;只能用指针遍历;
cout<<"原始链表:";
while(ite !=lis.end())
{
cout<< *ite << " ";
++ite;
}
cout << endl;
//一、插入作为尾;
cout<<"插入作为尾:";
lis.push_back(11);
lis.push_back(11);
lis.push_back(12);
lis.push_back(12);
lis.push_back(13);
lis.push_back(15);
::for_each(lis.begin(),lis.end(),&Show);
cout<<endl;
//二、插入作为头:
cout<<"插入作为头:";
lis.push_front(7);
lis.push_front(7);
lis.push_front(4);
lis.push_front(7);
lis.push_front(2);
lis.push_front(4);
::for_each(lis.begin(),lis.end(),&Show);
cout<<endl;
//三、删除头
cout<<"删除头:";
lis.pop_front();
lis.pop_front();
lis.pop_front();
::for_each(lis.begin(),lis.end(),&Show);
cout<<endl;
//四、删除尾
cout<<"删除尾:";
lis.pop_back();
lis.pop_back();
lis.pop_back();
::for_each(lis.begin(),lis.end(),&Show);
cout<<endl;
//五、将数值为value的所有元素移除
cout<<"移除10: ";
lis.remove(10);
::for_each(lis.begin(),lis.end(),&Show);
cout<<endl;
//六、将“连续而相同的元素”移除只剩一个
cout<<"将“连续而相同的元素”移除只剩一个:";
lis.unique();
::for_each(lis.begin(),lis.end(),&Show);
cout<<endl;
//七、将x结合于position所指位置之前。X 必须不同于*this
//cout<<"新建一个链表全部插入到7之前: ";
ite=::find(lis.begin(),lis.end(),7);
list<int> Newlis(2,1);//新建一个链表
Newlis.push_back(2);
Newlis.push_back(3);
Newlis.push_back(5);
//lis.splice(ite,Newlis);
//::for_each(lis.begin(),lis.end(),&Show);
//cout<<endl;
//八、将i所指的元素结合于position所指位置之前。Position 和 i 可指向同一个list
//cout<<"新建一个链表其中的值为5的节点插入到7之前: ";
list<int>::iterator First=::find(Newlis.begin(),Newlis.end(),5);
//lis.splice(ite,Newlis,First);
//::for_each(lis.begin(),lis.end(),&Show);
//cout<<endl;
//九、将[first, last)内的所有元素结合于 \
position 所指的位置之前,position和[first, last)可指向同一个list,\
但是position 不能位于[first, last)之内。
cout<<"新建一个链表其中的值为[2,5)的一段节点插入到7之前: ";
list<int>::iterator End=::find(Newlis.begin(),Newlis.end(),2);
lis.splice(ite,Newlis,End,First);
::for_each(lis.begin(),lis.end(),&Show);
cout<<endl;
system("pause");
return 0;
}