STL list 雙向鍊錶 詳解

2021-09-12 18:44:40 字數 2015 閱讀 5553

閒話:當你了解了stl中的一兩個容器之後,再去學習它另外的容器,就會發現它們的重合點非常多。

如果你不想看這麼多字,那麼前兩段就可以略過了。。。

list 容器視線裡雙向鍊錶的資料結構,資料元素通過鍊錶指標連城邏輯意義上的線性表,這樣,對鍊錶的任一位置的元素進行插入、刪除和查詢都會是極快的。下圖是list 採用的雙向迴圈鍊錶的結構示意圖。

list 的每個結點有三個域:前驅元素指標域、資料域、後繼元素指標域。前驅元素指標域儲存了前驅元素的首位址;資料域則儲存本節點的資料;後繼元素指標域則儲存後繼元素的首位址。list 的頭結點的前驅元素指標域儲存的是鍊錶中尾元素的首位址,而list 的尾節點的後繼元素指標域則儲存了頭結點的首位址,這樣,就構成了乙個雙向的迴圈鏈。

由於 list 物件的結點並不要求在一段連續的記憶體中,所以對於迭代器,只能通過「++」或「–」的操作將迭代器移動到後繼/前驅節點處,而不能通過對迭代器進行+n或-n的操作(這句應該劃重點)。這是與vector不同的地方。

#include
list l;

//建立list物件

listl(

10);//建立乙個有十個元素的list物件,每個元素預設為0

listl(

10,4)

;//建立乙個有十個元素的list物件,每個元素都為

l.

push_back(10

);//尾部插入新元素

l.push_front(11

);//首部插入新元素

list

::iterator it=l.

begin()

;//定義迭代器

l.insert

(++it,8)

;//在指定迭代器的位置插入新元素(迭代器只能--,++)

注:與 deque(雙端佇列)不同的是,以上三種插入方法都會是鍊錶自動擴張。這是真正的插入新元素,而不是對舊元素的覆蓋。

list

::iterator it;

//迭代器遍歷

for(it=l.

begin()

;it!=l.

end(

);it++

) cout<<

*it<<

" ";

list

::reverse_iterator rit;

//反向迭代器遍歷

for(rit=l.

rbegin()

;rit!=l.

rend()

;rit++

)

注:不可以用下標法隨機訪問、遍歷。

l.

pop_back()

;//刪除尾部元素

l.pop_front()

;//刪除首部元素

l.erase

(it)

;//刪除迭代器指定元素

l.clear()

;//清空鍊錶

l.remove(4

);//刪除所有值為4的元素

l.unique()

;//剔除連續重複元素,只保留乙個

l.

sort()

;//以公升序排列

it=find

(l.begin()

,l.end()

,10);

//在迭代器區間內查詢元素10,找到就返回該位置的迭代器,否則返回end()//包含在標頭檔案algorithm裡

#include

#include

#include

using namespace std;

int main()

STL list 雙向鍊錶)

標準模板庫以list的方式向程式設計師提供了乙個雙向鍊錶。list可以有多種初始化方式 可用push front 和push back 在開頭和末尾插入元素 可用insert 在任意位置插入元素 可用erase 刪除list中的元素 可用reverse 反轉list中的元素 可用sort 對list...

雙向迴圈鍊錶(為STL LIST 做準備)

struct list struct list 鍊錶構建容易錯誤的地方在於插入和刪除。插入 我們把n節點插入p節點之後。需要1.用n的next指標指向p的下乙個節點l。2用l的prev指標指向n。3.用n的prev指標指向p。刪除 刪除時我們一般 1.建立乙個指標tmp指向所要刪除的p節點的下乙個節...

雙向鍊錶(詳解)

雙向鍊錶操作 在學習了單鏈表之後,就順帶學習了雙鏈表的操作。什麼是雙鏈表?雙鏈表顧名思義,就是鍊錶由單向的鏈變成了雙向鏈。使用這種資料結構,我們可以不再拘束於單鏈表的單向建立於遍歷等操作,大大減少了在使用中存在的問題。在單鏈表中,我們有乙個資料域,還有乙個指標域,資料域用來儲存相關資料,而指標域則負...