list簡介
list 也是順序容器的一種。只是list 是一個雙向鏈表。使用 list 需要包含頭文件 list。雙向鏈表的每個元素中都有一個指針指向后一個元素,也有一個指針指向前一個元素,如下圖所示。
當然,list的用法和vector很類似,也擁有順序容器中的常用方法,需要注意的是**list不支持使用下標隨機存取元素。
在 list 容器中,在已經定位到要增刪元素的位置的情況下,增刪元素能在常數時間內完成。如下圖所示,在 ai 和 ai+1 之間插入一個元素,只需要修改 ai 和 ai+1 中的指針即可:
list的成員函數
void push_front(const T & val) 將 val 插入鏈表最前面
void pop_front() 刪除鏈表最前面的元素
void sort() 將鏈表從小到大排序
void remove (const T & val) 刪除和 val 相等的元素
remove_if 刪除符合某種條件的元素
void unique() 刪除所有和前一個元素相等的元素
void merge(list <T> & x) 將鏈表 x 合並進來並清空 x。要求鏈表自身和 x 都是有序的
void splice(iterator i, list <T> & x, iterator first, iterator last) 在位置 i 前面插入鏈表 x 中的區間 [first, last),並在鏈表 x 中刪除該區間。鏈表自身和鏈表 x 可以是同一個鏈表,只要 i 不在 [first, last) 中即可
list的用法實例
#include <iostream>
#include <list>
using namespace std;
int main(){
int a[6] = {1,3 ,2, 5,2,3};
int b[5] = {1,3,2,4,6};
list<int> L(a,a+6);
list<int> Lb(b,b+5);
list<int>::iterator pl;
cout<< "element in L : " ;
for(pl = L.begin(); pl != L.end();++pl){
cout << *pl << " " ;
}
cout << endl;
cout<< "element in Lb : " ;
for(pl = Lb.begin(); pl != Lb.end();++pl){
cout << *pl << " " ;
}
cout << endl;
L.sort();
cout<< "1) sort L: " ;
for(pl = L.begin(); pl != L.end();++pl){
cout << *pl << " " ;
}
cout << endl;
cout <<"2) after delete element 2: ";
L.remove(2);
for(pl = L.begin(); pl != L.end();++pl){
cout << *pl << " " ;
}
cout << endl;
cout << "3) delete first element in Lb: ";
Lb.pop_front();
for(pl = Lb.begin(); pl != Lb.end();++pl){
cout << *pl << " " ;
}
cout << endl;
cout << "4) delete all same element in L: ";
L.unique();
for(pl = L.begin(); pl != L.end();++pl){
cout << *pl << " " ;
}
cout << endl;
//使用merge
Lb.sort();
L.merge(Lb);
cout << "5) merge L with Lb: ";
L.unique();
for(pl = L.begin(); pl != L.end();++pl){
cout << *pl << " " ;
}
cout << endl;
cout << " size of Lb: " << Lb.size()<<endl;
L.reverse();
cout << "6) reverse L ";
for(pl = L.begin(); pl != L.end();++pl){
cout << *pl << " " ;
}
cout << endl;
return 0;
}
輸出結果如下: