三大類容器:
1. 序列式容器:vector、deque、list
vector是一種動態陣列,在記憶體中具有連續的儲存空間,支援快速隨機訪問。由於具有連續的儲存空間,所以在插入和刪除操作方面,效率比較慢。vector有多個建構函式,預設的建構函式是構造乙個初始長度為0的記憶體空間,且分配的記憶體空間是以2的倍數動態增長的,即記憶體空間增長是按照20,21,22,23.....增長的,在push_back的過程中,若發現分配的記憶體空間不足,則重新分配一段連續的記憶體空間,其大小是現在連續空間的2倍,再將原先空間中的元素複製到新的空間中,效能消耗比較大,尤其是當元素是非內部資料時(非內部資料往往構造及拷貝建構函式相當複雜)。vector的另乙個常見的問題就是clear操作。clear函式只是把vector的size清為零,但vector中的元素在記憶體中並沒有消除,所以在使用vector的過程中會發現記憶體消耗會越來越多,導致記憶體洩露,現在經常用的方法是swap函式來進行解決:
vectorv;v.push_back(1); v.push_back(2);v.push_back(1); v.push_back(2);
vector().swap(v); 或者 v.swap(vector());
利用swap函式,和臨時物件交換,使v物件的記憶體為臨時物件的記憶體,而臨時物件的記憶體為v物件的記憶體。交換以後,臨時物件消失,釋放記憶體。
deque和vector類似,支援快速隨機訪問。二者最大的區別在於,vector只能在末端插入資料,而deque支援雙端插入資料。deque的記憶體空間分布是小片的連續,小片間用鍊錶相連,實際上內部有乙個map的指標。deque空間的重新分配要比vector快,重新分配空間後,原有的元素是不需要拷貝的。
list是乙個雙向鍊錶,因此它的記憶體空間是可以不連續的,通過指標來進行資料的訪問,這使list的隨機儲存變得非常低效,因此list沒有提供操作符的過載。但list可以很好地支援任意地方的插入和刪除,只需移動相應的指標即可。
三者的適合使用的場景:
1) 如果你需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector
2) 如果你需要大量的插入和刪除,而不關心隨即訪問,則應使用list
3) 如果你需要隨即訪問,而且關心兩端資料的插入和刪除,則應使用deque
2. 關聯式容器:map、set
3. 容器介面卡:queue、stac
C STL容器總結 序列式
vector容器 vector容器是最簡單的序列式容器,支援隨機訪問,隨機儲存。類似動態陣列,將元素置於動態陣列 vector可以實現佇列,陣列,堆疊的全部的功能 vector定義 vector vec vector函式 size 統計容器元素數量 capacity 返回容器最大可容納的元素數量 r...
C STL容器總結(史上最全!)
size 返回元素個數 empty 返回是否為空 clear 清空 front back push back pop back begin end 支援比較運算,按字典序first,第乙個元素 second,第二個元素 支援比較運算,以first為第一關鍵字,以second為第二關鍵字 字典序 si...
C STL容器總結篇之map
map是stl的乙個容器,和set一樣,map也是一種關聯式容器。它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map 現一次,第二個可能稱為該關鍵字的值 的資料處理能力,由於這個特性,有助於我們處理一對一資料。這裡說下map內部資料的組織,map內部是自建一顆紅黑樹 一種非嚴格意義上的平...