vector 是一個動態數組, 維護連續的線性空間。
.at()函數可以訪問數組的任意元素,編譯器會檢測下標是否越界,如果越界就會拋出異常。
begin()和end()函數可以獲取指向數組的第一個元素的迭代器和指向最後一個元素的迭代器。
front()函數和back()函數可以獲取數組的第一個元素和最後一個元素。
vector只支持push_back()和pop_back()函數在vector的末端進行插入和刪除元素,所以vector只支持單向的插入和刪除。
size()函數可以獲取目前使用空間的大小,,capacity()函數可以獲取預留空間的大小。
但是,要想插入或者刪除末端以外的元素就只能使用insert()或者erase()函數,這就涉及到重新配置新的內存空間、vector元素的移動、釋還舊的內存空間,
這是一個大的工程,時間消耗很大。這裏也有一點值得我們注意,所謂的動態空間增加,也並不是在原有的空間之後接續新的空間。
而且由於內存空間的變化,指向原vector的所有迭代器就都失效了。
vector的迭代器就是一個普通的指針。
list是一個雙向鏈表,內存空間是不連續的.
begin()和end()函數可以獲取指向list的第一個元素的迭代器和指向最後一個元素的迭代器。
front()函數和back()函數可以獲取list的第一個元素和最後一個元素。
list不僅支持push_back()和pop_back()函數在末端進行插入和刪除元素,還支持push_front()函數和pop_front()函數在首部進行插入和刪除元素。
size()函數可以獲取目前使用空間的大小,但是由於list預留空間是無限的,所以沒有capacity()函數。
list使用insert()函數和erase()函數進行插入刪除元素時,並不用涉及到空間的重新分配。除了被刪除的元素的迭代器失效,其他的迭代器都有效。
lsit迭代器的設計比較複雜,因爲要重載operator*、operator++、operator--等元素符。
list還有一些獨有的函數:remove()、unique()、splice()、merge()、sort()。
deque是一個雙端隊列,是連續內存空間(邏輯上),是由一段一段的連續內存空間拼接成的。
dque採用map來管理內存空間,map裏面存着指向緩衝區的指針,緩衝區用於存儲deque中的元素,默認緩衝區大小爲512bytes.
.at()函數可以訪問隊列的任意元素,編譯器會檢測下標是否越界,如果越界就會拋出異常。
begin()和end()函數可以獲取指向隊列的第一個元素的迭代器和指向最後一個元素的迭代器。
front()函數和back()函數可以獲取隊列的第一個元素和最後一個元素。
deque不僅支持push_back()和pop_back()函數在末端進行插入和刪除元素,還支持push_front()函數和pop_front()函數在首部進行插入和刪除元素。
size()函數可以獲取目前使用空間的大小,,沒有capacity()函數。
總結:
看起來vector、list和deque大多操作都是差不多,實際上deque的操作遠比vector、list的複雜,具體可以參考<STL源碼解析>看看vector 、list、deque的底層實現。
建議不要輕易使用deque.
至於vector和list的使用,可以看具體的需求,應該很好分析使用哪個最好。