/*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;
}