閒話:當你了解了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節點的下乙個節...
雙向鍊錶(詳解)
雙向鍊錶操作 在學習了單鏈表之後,就順帶學習了雙鏈表的操作。什麼是雙鏈表?雙鏈表顧名思義,就是鍊錶由單向的鏈變成了雙向鏈。使用這種資料結構,我們可以不再拘束於單鏈表的單向建立於遍歷等操作,大大減少了在使用中存在的問題。在單鏈表中,我們有乙個資料域,還有乙個指標域,資料域用來儲存相關資料,而指標域則負...