C STL之list雙向鍊錶容器

2021-09-30 16:59:01 字數 2559 閱讀 5749

不同於採用線性表順序儲存結構的vector和deque容器,list雙向鍊錶中任一位置的元素查詢、插入和刪除,都具有高效的常數階演算法時間複雜度o(1)。

list技術原理

為了支援前向和反向訪問list容器的元素,list採用雙向迴圈的鍊錶結構組織資料元素,鍊錶的每個節點包括指向前驅的指標、實際資料和指向後繼的指標等資料域。

list的前向鏈,由頭節點→第1個節點→第2個節點→…第n個節點→頭節點構成迴圈。

list的反向鏈,則由第n個節點→第n-1個節點→…→頭節點→第n個節點構成迴圈。n為list的節點個數,整個鍊錶的儲存位置由頭指標指出,它指向頭節點。

應用基礎

list物件的建立,初始化賦值方法與vector相同,list的交換與deque相同,這裡直接跳過。

2.1元素的遍歷訪問

由於鍊錶中的資料需要乙個個元素進行遍歷,因此,list元素的遍歷只使用迭代器的方式進行。上**:

struct student;

int main(int argc, char *ar**)

, ,,};

//將資料插入鍊錶

listl;

l.push_back(s[0]);

l.push_back(s[1]);

l.push_back(s[2]);

//遍歷列印鍊錶元素

list::iterator i,iend;

iend=l.end();

cout << "姓名 年齡 城市 **" << endl;

cout << "----------------------------" << endl;

for(i=l.begin();i!=iend;i++)

cout << "----------------------------" << endl;

return a.exec();}

執行結果:

2.2元素的插入

由於list鍊錶元素的插入不需要對其他元素進行移位拷貝,除了push_back函式在尾部新增元素外,list還提供了在鏈首插入元素的push_front函式和在任意迭代器位置的插入insert()函式。

int main(int argc, char *ar**)

return a.exec();}

輸出結果:

2.3元素的反向遍歷和刪除

由於list容器的迭代器具有"–"操作,因此也定義了反向迭代器。用反向迭代器來進行鍊錶的遍歷。

int main(int argc, char *ar**)

cout << endl;

list::iterator i,iend;

i=l.begin();

i++;

l.erase(i); //刪除6

l.pop_back(); //刪除末元素10

l.pop_front(); //刪除首元素5

l.remove(9); //刪除所有值為9的元素

iend=l.end();

for(i=l.begin();i!=iend;i++)

cout << endl;

return a.exec();}

執行結果:

2.4list的排序與歸併

list 提供的void sort函式,將鍊錶中的元素按"

list鍊錶元素的排序,是將list鍊錶分割成若干部分進行子排序,然後通過歸併處理,實現list的所有元素的排序。為此,list容器提供了splice和merge的歸併函式。

void splice(iterator position,list& x) //將x的鍊錶歸併到當前list鍊錶的position之前,list物件x將被清空

void splice(iterator position,list&,iterator i)//將乙個list的迭代器i值所指的元素,歸併到當前list鍊錶中,並將被歸併的元素從原煉表中刪除

void merge(list& x)//將list物件x的鍊錶歸併到當前list鍊錶中,並清空x的鍊錶。從merge函式的原始碼可知,只有當前的list鍊錶和x均預先按元素的"

上**:

void print(list& l)

cout<< endl;

}int main(int argc, char *ar**)

3.小結

list雙向鍊錶容器採用雙向鍊錶的資料結構來儲存資料,可高效查詢、插入和刪除容器元素。list提供的splice和merge歸併函式,可用於鍊錶的元素排序。

C STL之雙向鍊錶list

一 list的基本使用以及耗時測試 include include qsort bsearch null includeusing namespace std const int size 100000 int main cout 插入1000000個元素耗時為 clock start endl c...

c stl的list(雙向鍊錶)

1.list初始化 1 listt 沒有任何元素 2 listt 10 建立有 10個元素的鍊錶 3 listt 10,3 建立有 10個元素的鍊錶,並且每個元素為3 2.對鍊錶進行插入操作 1 前插法 在鍊錶頭部插入新元素,鍊錶自動擴張,形式 t.push front 8 2 尾插法 在鍊錶尾部插...

C STL 10 list 雙向鍊錶

鍊錶 缺點 無法訪問位置 沒有index的概念。陣列可以 index 優點 在序列已知的任何位置插入或刪除元素。可以合併 去重 交換。一樣的增刪改查上 void listtest cout endl int a 5 int b 7 listlst1 a,a 5 listlst2 b,b 7 cout...