/**List容器*/
/*2015.05.27 18:03 第一次整理*/
/*2015.05.27 18:03 第一次整理*/
/*2015.05.29 21:56 第二次整理完毕*/
/*list容器就是一个双向链表,可以高效地进行插入删除元素。适合需要频繁插入和删除数据的场合,这个和vector刚好相反*/
/*list不支持随机访问*/
/*插入操作和删除操作都不会造成原有的list迭代器失效*/
#include <iostream>
#include <cstdio>
#include <list>
#include <string>
#include <functional>
using namespace std;
int main()
{
///构造
list<int> l0;//空链表;
list<int> l1(3);//建立含三个默认值为0的元素的链表
list<int> l2(5,2);//建立一个含五个元素值都为2的链表
list<int> l3(l1);//复制l1的元素
list<int> l4(l2.begin(),l2.end());//l4包含l2【first,last)区域的元素
///遍历
int n = l2.front();//返回第一个元素的引用
/*cout << n << endl;//n = 2;*/
n = l2.back();//返回最后一个元素的引用
/*begin(),end(),rbegin(),rend()用法同map*/
///大小判断
int nSize = l2.size();
/*cout << nSize << endl;*/
if(l0.empty())
{
/*cout << "empty" << endl;*/
}
///插入元素
list<int>::iterator listIte;
l2.push_back(4);//添加到链表尾
l2.push_front(3);//添加到表头
/**for(listIte = l2.begin();listIte != l2.end();++listIte)
{
cout << "list2:" << *listIte << endl;
}//3,2,2,2,2,2,4*/
listIte = l2.begin();
(listIte++)++;//内存不连续的容器的迭代器只支持自加
l2.insert(listIte,6);//listIte前插入6
n = 2;
l2.insert(listIte,n,5);
list<int>:: iterator first,last;
first = last = l2.begin();
first++;
(last++)++;
l2.insert(listIte,first,last);//不起作用?
/**for(listIte = l2.begin(); listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}//3,6,5,5,2,2,2,2,2,4
cout << l2.size() << endl;//10*/
///操作函数
l2.sort();//排序函数,默认从小大排序
/**for(listIte = l2.begin(); listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}*/
l2.sort(greater<int>());//系统自带比较函数,从大到小排序
/**for(listIte = l2.begin(); listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}*/
l2.unique();//去除相邻的相同元素,只留下一个
/**for(listIte = l2.begin();listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}输出6,5,4,3,2*/
list<int>:: iterator listIte1 = l2.begin();
l2.splice(listIte1,l4);//将l4中的元素全部移到listIte1前,l4变为空
/**for(listIte = l2.begin();listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}输出2,2,2,2,2,6,5,4,3,2*/
l2.unique();
/**for(listIte = l2.begin();listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}//输出2,6,5,4,3,2*/
list<int>::iterator listIteFirst = l3.begin();
listIte = l2.begin();
l2.splice(listIte,l3,listIteFirst);//将l3中listIteFirst位置的元素移入到listIte前
/**for(listIte = l2.begin();listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}//输出0,2,6,5,4,3,2*/
first = l3.begin();
last = l3.end();
listIte = l2.begin();
l2.splice(listIte,l3,first,last);//将l3中first到last中间的元素移到l2中listIte前
/**for(listIte = l2.begin();listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}//输出0,0,0,2,6,5,4,3,2*/
l2.reverse();//翻转l2中的元素
/**for(listIte = l2.begin();listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}*/
l3.push_back(9);
l3.push_back(11);
l3.push_back(10);
l2.merge(l3);//l3,l2无序,则将l3移动到l2尾部
/**for(listIte = l2.begin();listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}//输出2,3,4,5,6,2,0,0,0,9,10,11*/
l3.sort();
l3.unique();
l2.sort();
l2.unique();
l2.merge(l3);//将l3合并到l2中,仍然保持有序
/**for(listIte = l2.begin();listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}//输出0,2,3,4,5,6,9,10,11*/
///删除元素
if(!l2.empty())
{
l2.pop_back();//删除尾部元素
}
if(!l2.empty())
{
l2.pop_front();//删除头部元素
}
l2.remove(2);//删除容器中所有值为2的元素
/**for(listIte = l2.begin(); listIte != l2.end();++listIte)
{
cout << *listIte << endl;
}//输出6,5,5*/
listIte = l2.begin();
l2.erase(listIte);//返回值为listIte指向的下一个元素,且执行完后listIte原地址已经被销毁,
listIte++;//此操作无意义
/**cout << *listIte << endl;//输出一个随机值*/
for(listIte = l2.begin(); listIte != l2.end();)
{
if(1)
{
l2.erase(listIte++);//不能在执行erase后让迭代器自加
}
else
{
listIte++;
}
}
first = l4.begin();
last = l4.end();
l2.erase(first,last);
/**if(l2.empty() && l4.empty())
{
cout << "empty" << endl;
}*/
return 0;
}