1. 程式人生 > >C++ STL 順序容器--list + 關聯容器

C++ STL 順序容器--list + 關聯容器

list 

  雙向環裝連結串列,可以雙向遍歷,但不能隨機訪問任意元素,可動態增加或者減少元素,記憶體管理自動完成,增加任何元素都不會使迭代器失效,

  刪除元素時,除了指向當前被刪元素的迭代器外,其他迭代器都不會失效

  iterator指向當前被刪除元素的下一個。

deque

  vector是單向開口的連續空間,deque是雙向開口的連續線性空間

  雙向開口則意味著可以在頭尾兩端分別插入或者刪除元素

 

關聯容器和順序容器的區別在於:關聯容器通過key儲存讀取元素,而順序容器則是通過元素在容器中的位置順序儲存和訪問元素

關聯容器:map set(紅黑樹實現)

map

  所有元素根據元素的鍵值自動排序。map的所有元素都是pair,同時擁有key和value,不允許有2個相同的key值

  map和list某些性質類似,客戶端對他進行刪除或者增加時,操作之前的所有迭代器仍然有效,當然,被刪除的那個除外

set

  所有元素根據元素的鍵值自動排序,set元素的鍵值就是實值

  set和list某些性質類似,客戶端對他進行刪除或者增加時,操作之前的所有迭代器仍然有效,當然,被刪除的那個除外

 

如何選擇合適的容器?

  1)插入刪除影響容器的選用

  list容器表示不連續的記憶體區域,雙向環狀連結串列,允許向前或者向後遍歷,在任何位置都能insert或者erase,insert或者erase不需要一定別的元素

  vector除了在末尾插入元素,不用移動其他位置元素,其他位置插入刪除都需要,是連續的記憶體空間。

  2)元素的訪問影響選擇

  vector和deque支援對元素實現高效的隨機訪問,vector容器每次訪問都是距離起點的固定偏移,隨機訪問十分有效。但是,list容器訪問則特別的慢

  通常,除非找到選擇使用其他容器更好得分理由,否則我們都選擇vector

選擇容器的提示

  1)隨機訪問->vector/deque

  2)中間位置插入刪除->list

  3)首部或者尾部插入刪除->deque

 

  如果無法確定某種應用選擇哪種容器,編寫程式碼時只使用vector/list容器提供的操作:使用迭代器而不是下標,避免隨機訪問元素。在必要時,可以很方便的將vector容器變成list容器。

PS(黃色筆記上整理 有部分未整理 有需要可以在細看)