STL幾個容器的比較

2021-09-12 23:16:44 字數 2203 閱讀 2005

vector:連續記憶體,隨機訪問資料成員快,但是頻繁的插入(需要移動要插入的元素的後面的所有元素)或者擴容(vector擴容後會清掉原來的資料,拷貝到新的申請的大的記憶體中去,特別是有比較複雜的類的時候會呼叫構造和析構函式極大影響效能)的操作會影響效能。vector的另乙個常見的問題就是clear操作。clear函式只是把vector的size清為零,但vector中的元素在記憶體中並沒有消除,所以在使用vector的過程中會發現記憶體消耗會越來越多,導致記憶體洩露,現在經常用的方法是swap函式來進行解決:利用swap函式,和臨時物件交換,交換以後,臨時物件消失,釋放記憶體。

list:鏈式分布於記憶體中。訪問資料成員很慢,需要從頭逐個遍歷,但是插入和刪除元素不需要移動其他資料成員。

set: 對於關聯容器(包括map)來說,不需要做記憶體拷貝和記憶體移動。set容器內所有元素都是以節點的方式來儲存,其節點結構和鍊錶差不多,指向父節點和子節點。在set中查詢是使用二分查詢,也就是 說,如果有16個元素,最多需要比較4次就能找到結果,有32個元素,最多比較5次。那麼有10000個呢?最多比較的次數為log10000,最多為 14次,如果是20000個元素呢?最多不過15次。看見了吧,當資料量增大一倍的時候,搜尋次數只不過多了1次,多了1/14的搜尋時間而已。

deque: deque和vector類似,支援快速隨機訪問。二者最大的區別在於,vector只能在末端插入資料,而deque支援雙端插入資料。deque的記憶體空間分布是小片的連續,小片間用鍊錶相連,實際上內部有乙個map的指標。deque空間的重新分配要比vector快,重新分配空間後,原有的元素是不需要拷貝的,可以認為deque是vector和list的折中。

1 如果你需要高效的隨訪問,而不在乎插入和刪除的效率,使用vector

2 如果你需要大量的插入和刪除,而不關心隨即訪問,則應使用list

3 如果你需要隨即訪問,而且關心兩端資料的插入和刪除,則應使用deque

4 有些地方使用set作為vector和list的替代品,因為(1)set是鏈式,插入和刪除快.(2)set是二分法查詢,隨機訪問成員速度也比較快。

set 和 vector的簡單比較:

(1)為何map和set的插入刪除效率比用其他序列容器高?

大部分人說,很簡單,因為對於關聯容器來說,不需要做記憶體拷貝和記憶體移動。說對了,確實如此。set容器內所有元素都是以節點的方式來儲存,其節點結構和鍊錶差不多,指向父節點和子節點。結構圖可能如下:a/

b c/ \ /

d e f g

因此插入的時候只需要稍做變換,把節點的指標指向新的節點就可以了。刪除的時候類似,稍做變換後把指向刪除節點的指標指向其他節點也ok了。這裡的一切操作就是指標換來換去,和記憶體移動沒有關係。

(2)為何每次insert之後,以前儲存的iterator不會失效?

iterator這裡就相當於指向節點的指標,記憶體沒有變,指向記憶體的指標怎麼會失效呢(當 然被刪除的那個元素本身已經失效了)。相對於vector來說,每一次刪除和插入,指標都有可能失效,呼叫push_back在尾部插入也是如此。因為為 了保證內部資料的連續存放,iterator指向的那塊記憶體在刪除和插入過程中可能已經被其他記憶體覆蓋或者記憶體已經被釋放了。即使時push_back的 時候,容器內部空間可能不夠,需要一塊新的更大的記憶體,只有把以前的記憶體釋放,申請新的更大的記憶體,複製已有的資料元素到新的記憶體,最後把需要插入的元素 放到最後,那麼以前的記憶體指標自然就不可用了。特別時在和find等演算法在一起使用的時候,牢記這個原則:不要使用過期的iterator。

(3)當資料元素增多時,set的插入和搜尋速度變化如何?

如果你知道log2的關係你應該就徹底了解這個答案。在set中查詢是使用二分查詢,也就是 說,如果有16個元素,最多需要比較4次就能找到結果,有32個元素,最多比較5次。那麼有10000個呢?最多比較的次數為log10000,最多為 14次,如果是20000個元素呢?最多不過15次。看見了吧,當資料量增大一倍的時候,搜尋次數只不過多了1次,多了1/14的搜尋時間而已。你明白這 個道理後,就可以安心往裡面放入元素了。

map,set屬於標準關聯容器,使用了非常高效的平衡檢索二叉樹:紅黑樹,他的插入刪除效率比其他序列容器高是因為不需要做記憶體拷貝和記憶體移動,而直接替換指向節點的指標即可。

set和vector的區別在於set不包含重複的資料。set和map的區別在於set只含有key,而map有乙個key和key所對應的value兩個元素。

map和hash_map的區別是hash_map使用了hash演算法來加快查詢過程,但是需要更多的記憶體來存放這些hash桶元素,因此可以算得上是採用空間來換取時間策略。

STL容器效率比較

1 vector 變長一維陣列,連續存放的記憶體塊,有保留記憶體,堆中分配記憶體 支援操作,高效率的隨機訪問 在最後增加元素時,一般不需要分配記憶體空間,速度快 在中間或開始操作元素時要進行記憶體拷貝效率低 vector高效的原因在於配置了比其所容納的元素更多的記憶體,記憶體重新配置會花很多時間 注...

STL容器效率比較

1 vector 變長一維陣列,連續存放的記憶體塊,有保留記憶體,堆中分配記憶體 支援操作,高效率的隨機訪問 在最後增加元素時,一般不需要分配記憶體空間,速度快 在中間或開始操作元素時要進行記憶體拷貝效率低 vector高效的原因在於配置了比其所容納的元素更多的記憶體,記憶體重新配置會花很多時間 注...

STL容器的效率比較

順序儲存容器 string vector list deque 關聯儲存容器 map底層採用的是樹型結構,多數使用平衡二叉樹實現,查詢某一值是常數時間,遍歷起來效果也不錯,只是每次插入值的時候,會重新構成底層的平衡二叉樹,效率有一定影響.set 和map都是無序的儲存元素,只能通過它提供的介面對裡面...