STL常用容器

STL是C/C++開發中一個非常重要的模板,而其中定義的各種容器也是非常方便我們大家使用。下面,我們就淺談某些常用的容器。這裏我們不涉及容器的基本操作之類,只是要討論一下各個容器其各自的特點。STL中的常用容器包括:順序性容器(vector、deque、list)、關聯容器(map、set)、容器適配器(queue、stac)。

1、順序性容器
(1)vector
  vector是一種動態數組,在內存中具有連續的存儲空間支持快速隨機訪問。由於具有連續的存儲空間,所以在插入和刪除操作方面,效率比較慢。vector有多個構造函數,默認的構造函數是構造一個初始長度爲0的內存空間,且分配的內存空間是以2的倍數動態增長的,即內存空間增長是按照20,21,22,23…..增長的,在push_back的過程中,若發現分配的內存空間不足,則重新分配一段連續的內存空間,其大小是現在連續空間的2倍,再將原先空間中的元素複製到新的空間中,性能消耗比較大,尤其是當元素是非內部數據時(非內部數據往往構造及拷貝構造函數相當複雜)。vector的另一個常見的問題就是clear操作。clear函數只是把vector的size清爲零,但vector中的元素在內存中並沒有消除,所以在使用vector的過程中會發現內存消耗會越來越多,導致內存泄露,現在經常用的方法是swap函數來進行解決: vector V;
    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對象的內存。交換以後,臨時對象消失,釋放內存。
  
(2)deque
  deque和vector類似,支持快速隨機訪問。二者最大的區別在於,vector只能在末端插入數據,而deque支持雙端插入數據。deque的內存空間分佈是小片的連續,小片間用鏈表相連,實際上內部有一個map的指針。deque空間的重新分配要比vector快,重新分配空間後,原有的元素是不需要拷貝的。

(3)list
  list是一個雙向鏈表,因此它的內存空間是可以不連續的,通過指針來進行數據的訪問,這使list的隨機存儲變得非常低效,因此list沒有提供[]操作符的重載。但list可以很好地支持任意地方的插入和刪除,只需移動相應的指針即可

(4)容器選擇:
在實際使用時,如何選擇這三個容器中哪一個,應根據你的需要而定,一般應遵循下面的原則:
  1) 如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
  2) 如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list
  3) 如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque
  
2、關聯容器
(1)map
  map是一種關聯容器,該容器用唯一的關鍵字來映射相應的值,即具有key-value功能。map內部自建一棵紅黑樹(一種自平衡二叉樹),這棵樹具有數據自動排序的功能,所以在map內部所有的數據都是有序的,以二叉樹的形式進行組織。map是關鍵字和值的集合,可以將人命作爲關鍵字,將其電話號碼作爲值,稱這種數據結構爲“將名字映射到電話號碼”。給定一個名字到電話號碼的map,我們可以使用一個人的名字作爲下標來獲取此人的電話號碼。
(2)set
  set也是一種關聯性容器,它同map一樣,底層使用紅黑樹實現,插入刪除操作時僅僅移動指針即可,不涉及內存的移動和拷貝,所以效率比較高。set中的元素都是唯一的,而且默認情況下會對元素進行升序排列。所以在set中,不能直接改變元素值,因爲那樣會打亂原本正確的順序,要改變元素值必須先刪除舊元素,再插入新元素。不提供直接存取元素的任何操作函數,只能通過迭代器進行間接存取。

3、容器適配器

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