STL中的容器是如何實現的,如何儲存的

2022-04-08 18:32:52 字數 1515 閱讀 8082

標準的stl中關聯容器有set map multiset multimap,這四種容器都是基於紅黑樹實現的。

使用這些容器需要包含#include #include

sgi stl還提供了標準之外的以基於hash table實現的的hash_set   hash_map  hash_multiset  hash_multimap.

使用這些容器需要包含#include #include

priority_queue是基於max-heap實現的,所謂max-heap,是一種特殊的完全二叉樹,父節點的值大於等於子節點的值。

注意,stl中定義的max-heap有make_heap()  push_heap()  pop_heap()  sort_heap()等操作,但其實本質上只有pop_heap()   push_heap()兩大項,其餘操作可看做是對這二項的封裝。

stl的max-heap是以vector形式存放的,max-heap不提供迭代器,不提供遍歷,也沒有刪除中間某個節點的操作,為什麼呢,因為stl中的heap是為實現priority_queue而定義的,而priority_queue僅提供隊頭隊尾的操作!

priority_queue和multiset有何區別呢?區別從實現上就可以看出來,multiset的底層——特殊的二叉搜尋樹——紅黑樹,是提供遍歷的,也提供刪除中間某個節點的操作。而且二叉搜尋樹本身的有序性要強(左《根《右,而max-heap僅父節點值最大)。紅黑樹的儲存是用parent leftchild  rightchild三個指標實現的,max-heap是用vector儲存的。

max-heap的push_heap()操作時通過新節點的上溯實現的。

而二叉搜尋樹的插入是從根節點開始比較,直到葉子節點。

max-heap的pop_heap()操作時取根節點,然後先下溯再上溯。

而二叉搜尋樹的刪除分被刪除結點的子節點數討論。

補充:堆排序的關鍵是堆的構造即make_heap,及取走根節點後的上下溯,其實堆排序就是對make_heap   pop_heap的使用!

vector儲存是連續的線性空間,deque是分段連續的,deque採用一小塊連續空間——map作為主控,map中存放的節點都是node,然後node再指向不同緩衝區。

那麼deque和vector的儲存區別就顯而易見了,vector動態增長時,要重新開闢一塊空間,將舊的內容複製到新空間。而deque動態增長時,只需讓map中指標再申請一塊記憶體(除非原來的map儲存空間也用完了,則需要複製map)。

list是雙向迴圈鍊錶。stack 和 queue是對deque的封裝。

至此,6個順序容器——vector list deque queue stack priority_queue,4個關聯式容器——set map multiset multimap的儲存和實現形式已經介紹完畢。

如何選擇STL容器?

大家知道,c 的stl標準庫很好用,裡面的vector,list,deque,stack,slist,set,map,都很好用。但是,在實際程式設計過程中,如何根據自己的專案需求選擇裡面的一種容器呢?最好的辦法就是了解其中的原理,然後做選擇。補充,如果專案中不考慮效率,就不用考慮那麼多了 畢竟stl...

常見的死鎖是如何產生的,如何避免

什麼場景下回發生00060死鎖問題 一般情況下,資料庫自身發生死鎖的情況很少,一般情況都是因為應用本身呼叫問題導致的00060異常。比如說有兩個會話sid,分別為 138 和136,這兩個會話都要對 6677 和 7788 兩個人加工資,但是執行的順序不一樣,操作分別是 會話session號 ses...

位元幣是如何產生的?如何獲得?

位元幣實際上只是區塊鏈上的乙個密碼鎖定的位址,而不是在你計算機上安裝乙個位元幣,您實際上擁有的是私鑰,可以解鎖位元幣在區塊鏈上的位置。位元幣的產生就和它的特性有關。位元幣不依賴任何機構發行,因此設計者中本聰就設計了乙個叫區塊鏈的程式,玩家只要按要求完成這個程式就可以獲得位元幣。這個過程被們戲稱稱為挖...