956
技術社區[雲棲]
轉貼:STL之list之用法小結
/*
list: 等同於雙向鏈表,內存空間可以是不連續的,通過指針來進行數據的訪問
優: 1)插入/刪除效率高
缺: 1)不支持隨機存取,查詢效率較低
*/
#include <iostream>
#include <string>
#include <list>
using namespace std;

void printList(list<int> nList)
{
//使用迭代器
//list<int>::iterator iter;
//for ( iter = nList.begin(); iter != nList.end(); iter++)
//{
// cout<<*iter<<", ";
//}

//使用迭代器指針
list<int>::iterator *pIter = new list<int>::iterator; //list<int>::iterator *pIter;error,原因見vector相應函數
if ( NULL == pIter )
{
return;
}
for (*pIter = nList.begin(); *pIter != nList.end(); (*pIter)++) //此處不可寫成*pIter++
{
cout<<**pIter<<", ";
}
cout<<endl;
}
int main()
{
//創建list
list<int> l1; //創建一個沒有任何元素的list
list<int> l2(10); //創建一個有n個元素的list,每個元素值為默認
list<double> l3(10, 9.3); //創建具有10個元素的list,每個元素的初始值為9.3
list<double> l4(l3); //通過拷貝一個list對象的元素,創建一個新的list對象
int iArray[] ={3, 10, 19};
list<int> l5(iArray, iArray + 3);//將另一個list對象的迭代器區間[first, last)所指的元素,拷貝到新創建的list對象中

//初如化賦值 :用push_back將元素依次鏈入LIST中
for (int i = 1; i<6; i++)
l1.push_back(i);

list<int>::iterator iter;
cout<<"printList(l1): "<<endl;
printList(l1);

//元素插入 :尾部添加用push_back(); 首部插入用push_front();任意位置插入用insert(&pos, elem)
//下麵語句error:list與vector不同,因為存儲方式上的差異, list不能+n,隻能++,
//這種情況下最好還是通過迭代器++為好
//l1.insert((l1.begin())+1, 100);
l1.insert(++l1.begin(), 100); //或者用iter=l1.begin(); iter++;l1.insert(iter, 100);
cout<<"++l1.insert(l1.begin(),100) (if use l1.begin()+1 is error) = "<<endl;
printList(l1);

cout<<"l1.push_back(200) = "<<endl;
l1.push_back(200);
printList(l1);
cout<<"l1.push_front(-200) = "<<endl;
l1.push_front(-200);
printList(l1);

//元素刪除: 尾部刪除用pop_back(); 首部刪除用pop_front();
//指定元素的刪除,位置用erase(&pos); 區間用erase(&first_pos, &last_pos)
//刪除所有元素用 clear();
//刪除list中所有元素值為value的元素用remove(value)
cout<<"l1.pop_back() = "<<endl;
l1.pop_back();
printList(l1);
cout<<"l1.pop_front() = "<<endl;
l1.pop_front();
printList(l1);

cout<<"l1.erase(++l1.begin()) = "<<endl;
l1.erase(++l1.begin());
printList(l1);

iter= l1.begin();
iter++;
iter++;
cout<<"iter=l1.begin; iter++;iter++; l1.erase(l1.begin(), iter) = "<<endl;
l1.erase(l1.begin(), iter);
printList(l1);
cout<<"l1.remove(100) = "<<endl;
l1.remove(100);
printList(l1);
cout<<"l1.remove(4) = "<<endl;
l1.remove(4);
printList(l1);

//其它
cout<<"其它: "<<endl;
list<int> listTest;
for (int i =1; i<6; i++)
listTest.push_back(i*100);
cout<<"printList(listTest) = "<<endl;
printList(listTest);
//swap函數
cout<<"after l1.swap(listTest), l1 = "<<endl;
l1.swap(listTest);
printList(l1);

//splice函數
//void splice(&pos, list &x):將list x歸並到當前list的&pos之前,同時list x將被清空
//void splice(&pos, list &x, &x.pos),將list x中迭代器x.pos處的元素歸並到當前list,同時被歸並的元素將被清空
cout<<"after l1.splice(l1.begin(), listTest):"<<endl;
l1.swap(listTest); //恢複
l1.splice(l1.begin(), listTest);
cout<<"l1 = "<<endl;
printList(l1);
cout<<"listTest = "<<endl;
printList(listTest);

l1.clear();
for (int i = 1; i<6; i++)
l1.push_back(i);
for (int i =1; i<6; i++)
listTest.push_back(i*100); //恢複
cout<<"after l1.splice(++l1.begin(), listTest, --listTest.end()) :"<<endl;
l1.splice(++l1.begin(), listTest, --listTest.end());
cout<<"l1 = "<<endl;
printList(l1);
cout<<"listTest = "<<endl;
printList(listTest);

//merge函數(略)歸並的兩鏈表都是是有序性,此函數才有意義
//sort
cout<<"now l1 is set as : "<<endl;
l1.clear();
for (int i = 9; i >= 0; i--)
l1.push_back(i);
printList(l1);

cout<<"l1.sort() = "<<endl;
l1.sort();
printList(l1);

cout<<"l1.empty() = "<<l1.empty()<<", l1.size() = "<<l1.size()<<endl;
cout<<"after l1.clear(): "<<endl;
l1.clear();
cout<<"l1.empty() = "<<l1.empty()<<", l1.size() = "<<l1.size()<<endl;
}



//測試結果
printList(l1):
1, 2, 3, 4, 5,
++l1.insert(l1.begin(),100) (if use l1.begin()+1 is error
1, 100, 2, 3, 4, 5,
l1.push_back(200) =
1, 100, 2, 3, 4, 5, 200,
l1.push_front(-200) =
-200, 1, 100, 2, 3, 4, 5, 200,
l1.pop_back() =
-200, 1, 100, 2, 3, 4, 5,
l1.pop_front() =
1, 100, 2, 3, 4, 5,
l1.erase(++l1.begin()) =
1, 2, 3, 4, 5,
iter=l1.begin; iter++;iter++; l1.erase(l1.begin(), iter)
3, 4, 5,
l1.remove(100) =
3, 4, 5,
l1.remove(4) =
3, 5,
其它:
printList(listTest) =
100, 200, 300, 400, 500,
after l1.swap(listTest), l1 =
100, 200, 300, 400, 500,
after l1.splice(l1.begin(), listTest):
l1 =
100, 200, 300, 400, 500, 3, 5,
listTest =

after l1.splice(++l1.begin(), listTest, --listTest.end())
l1 =
1, 500, 2, 3, 4, 5,
listTest =
100, 200, 300, 400,
now l1 is set as :
9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
l1.sort() =
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
l1.empty() = 0, l1.size() = 10
after l1.clear():
l1.empty() = 1, l1.size() = 0
最後更新:2017-04-04 07:03:23