链表(list)双向链表容器不支持随机访问,访问链表元素需要指出从链表的某个端点开始,插入和删操作所花费的时间是固定的,和该元素的位置无关。
在任何位置插入和删除动作都很快,不像vector只在末尾进行操作。
STL list容器由于采用了双向迭代器,不支持随机访问,所以标准库的merge(), sort()等功能函数都不适用,list单独实现了merge(),sort()等函数。
//STL--list总结
//STL list容器由于采用了双向迭代器,不支持随机访问,所以标准库的merge(), sort()等功能函数都不适用,list单独实现了merge(),sort()等函数。
#include<iostream>
#include<list>
#include<algorithm>
#include<cstdio>
#include<ctime>
#define MAXN 10
using namespace std;
void output(int n)
{
cout<<n<<" ";
}
bool compare(int a,int b)
{
return (a>b);
}
bool myFun(int n)
{
return (n==9);
}
int main()
{
list<int> list1;
cout<<"list1:"<<endl;
int i;
srand(time(NULL));
for (i = 0; i < MAXN; ++i)
list1.push_back(rand()%100);
cout<<"原始数字:";
for_each(list1.begin(),list1.end(),output);
cout<<endl;
list1.sort(compare);//注意排序调用方式
cout<<"降序排列:";
for_each(list1.begin(),list1.end(),output);
cout<<endl;
list1.sort();//注意排序调用方式
cout<<"升序排列:";
for_each(list1.begin(),list1.end(),output);
cout<<endl;
list<int> list2;
cout<<"list2:"<<endl;
list2.assign(list1.begin(),list1.end());
cout<<"原始数字:";
for_each(list2.begin(),list2.end(),output);
cout<<endl;
list2.push_back(101);//在list的末尾添加一个元素
cout<<"加入元素后:";
for(list<int>::iterator it=list2.begin();it!=list2.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
list1.swap(list2);
cout<<"交换后list1:";
for_each(list1.begin(),list1.end(),output);
cout<<endl;
cout<<"交换后list2:";
for_each(list2.begin(),list2.end(),output);
cout<<endl;
//list2.clear();//清空链表
//list2.push_front(100);//在list的头部添加一个元素
list2.merge(list1);//必须是有序序列,不然vs2012出错,不能合并
cout<<"list1,list2合并后:";
for_each(list2.begin(),list2.end(),output);
cout<<endl;
cout<<"合并后list1:";
for_each(list1.begin(),list1.end(),output);//合并后list1为空
cout<<endl;
list2.unique();
cout<<"list2删除重复元素:";
for_each(list2.begin(),list2.end(),output);
cout<<endl;
list2.insert(list2.begin(),2,9);//在指定位置插入两个元素
cout<<"插入两个元素后:";
for_each(list2.begin(),list2.end(),output);
cout<<endl;
list2.remove_if(myFun);//遍历一遍list
cout<<"删除指定两个元素后:";
for_each(list2.begin(),list2.end(),output);
cout<<endl;
system("pause");
return 0;
}