STL各容器的實現原理

2022-09-10 07:27:11 字數 821 閱讀 9973

stl共有六大元件

容器、演算法、迭代器、仿函式、介面卡、空間配置器

stl的實現是基於我們常見的資料結構

vector:動態陣列

list:雙鏈表

deque:分配**控制器map,map記錄著一系列的固定長度的陣列的位址。deque先從map**的位置(因為雙向佇列,前後都可以插入元素)找到乙個陣列位址,向該陣列中放入資料,陣列不夠時繼續在map中找空閒的陣列來存資料。當map也不夠時重新分配記憶體當作新的map,把原來map中的內容copy的新map中。所以使用deque的複雜度要大於vector,盡量使用vector。

stack:基於deque

queue:基於deque

heap:完全二叉樹,使用最大堆排序,以陣列vector 的形式存放

priority_queue:基於heap

slist:單向鍊錶

set、map、multiset、multimap:基於紅黑樹,一種加上了額外平衡條件的二叉搜尋樹

hash table:雜湊表。將待存資料的key經過對映函式變成乙個陣列(一般是vector)的索引,例如:資料的key%陣列的大小=陣列的索引(一般文字通過演算法也可以轉換為數字),然後將資料當作此索引的陣列元素。有些資料的key經過演算法的轉換可能是同乙個陣列的索引值(碰撞問題,可以用線性探測,二次探測來解決),stl是用開鏈的方法來解決的,每乙個陣列的元素維護乙個list,他把相同索引值的資料存入乙個list,這樣當list比較短時執行刪除,插入,搜尋等演算法比較快。

hash_map,hash_set,hash_multiset,hash_multimap:基於hash table

STL 中各容器的比較

list支援快速的插入和刪除,但是查詢費時 vector支援快速的查詢,但是插入費時。map查詢的時間複雜度是對數的,這幾乎是最快的,hash也是對數的。如果我自己寫,我也會用二叉檢索樹,它在大部分情況下可以保證對數複雜度,最壞情況是常數複雜度,而std map在任何情況下都可以保證對數複雜度,原因...

STL各容器使用場景

原文 stl中常見容器,主要包括如下幾種 vector,list,deque,set,multiset,map,multimap。選用合適的容器,對編寫高效的程式,簡潔的 有重要意義 最近就專案中就涉及到乙個容器選擇的問題,設計乙個資料結構時,開始使用了乙個錯誤的容器,容器設計非常複雜,使用起來也特...

STL容器 deque實現

vector是單向開口的連續線性空間,deque則是一種雙向開口的連續線性空間,可以在頭尾兩端分別做元素的插入和刪除操作。vector雖然從技術上也可以實現對頭尾兩端進行操作,但由於vector的底層實現特點的原因,其頭部操作效率奇差,故stl沒有為vector實現這一功能。deque和vector...