STL-順序容器-列表list

 list和雙向鏈表結構相似,每個節點包含一個數據塊,前向指針,和後向指針,存儲在非連續的內存空間

很顯然,查找操作時,只能順序查找,不支持內部隨機訪問;不像數組,向量vectoer,隊列可以用下標查找

但是可以在任意序列位置插入和刪除,這是vector和queue(deque)無法比擬的

而且相比較於vector佔用空間更多

list和循環鏈表也有相似的地方,即:頭節點的前驅元素指針域保存的是鏈表中尾元素的首地址list的尾節點的後繼元素指針域則保存了頭節點的首地址,這樣,list實際上就構成了一個雙向循環鏈。

對於迭代器,只能通過“++”或“--”操作將迭代器移動到後繼/前驅節點元素處。而不能對迭代器進行+n或-n的操作,與vector等不同。

常用操作:

1.list中的構造函數:
list() 聲明一個空列表;
list(n) 聲明一個有n個元素的列表,每個元素都是由其默認構造函數T()構造出來的
list(n,val) 聲明一個由n個元素的列表,每個元素都是由其複製構造函數T(val)得來的
list(first,last) 聲明一個列表,其元素的初始值來源於由區間所指定的序列中的元素


2.
list.push_back() 
list.push_front():
分別從list的末端插入,頭部插入元素。


3.

list.empty():判斷list是否爲空,空則返回true。


4.
list.resize(): 
序列長度調整,原序列超出元素刪除;
如果擴展,調用默認構造函數T()將元素加到list末端。
如果調用resize(n,val),則擴展元素要調用構造函數T(val)函數進行元素構造;


5.

list. clear(): 清空list中的所有元素。


6. 

list.front()和list.back(): 分別獲取list首,尾元素
list中元素是空的時候,這時候調用front()和back()會發生什麼呢?實際上會發生不能正常讀取數據的情況,但是這並不報錯,最好先調用empty()函數判斷list是否爲空。


7. 

list.pop_back和list.pop_front():分別刪除最後一個,第一個元素;序列必須不爲空,如果當list爲空的時候調用pop_back()和pop_front()會使程序崩掉。


8. 

assign():具體和vector中的操作類似,

list.assign(n,val) 將 list中元素變爲n個T(val)。

list.assign(list2.begin(),list2.end()) 將list2中的從list2.begin()到list2.end()之間的數值賦值給list。


9. 

swap():交換兩個鏈表(兩個重載), 
list1.swap(list2); 
swap(list1,list2),
都可以完成兩個列表的交換


10.

 list.reverse():完成list的反向。


11. 

merge():合併兩個鏈表並使之默認升序(可修改),
list.merge(list2,greater<int>()); 
調用結束後list2變爲空,list1中元素包含原來兩個序列中的元素,並且升序。
默認是升序,greater<int>()可以省略。


12.

insert某位置插入值

list.inset(位置,值);

list和循環鏈表也有相似的地方,即:頭節點的前驅元素指針域保存的是鏈表中尾元素的首地址,list的尾節點的後繼元素指針域則保存了頭節點的首地址,這樣,list實際上就構成了一個雙向循環鏈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章