重讀STL源碼剖析:map與set

map與set底層都是調用的RBTreenode

首先看RBTree數據結構

RBTree

紅黑樹的特性:函數

1.根節點爲黑色設計

2.新增節點必定是紅色指針

3.節點只有紅色或黑色兩種顏色排序

4.兩個節點顏色不能同爲紅變量

5.任意一條路徑上的黑色節點個數相同二叉樹

紅黑樹的節點設計:map

1.表示節點顏色的變量color迭代器

2.連接左子樹的left指針

3.連接右子樹的right指針

4.連接父節點的parent指針

5.表示節點值的變量value_field;在map中爲pair對,在set中只有key

RBTree的迭代器:

1.屬於雙向迭代器

2.RBTree是有排序的,迭代器的++與--其實是在二叉樹上找下一個節點的過程

RBTree的數據結構:

1.一個指向頭結點的指針header:

頭結點:

在RBTree中維護一個頭結點,這個頭結點的父節點其實是樹的根節點,而樹的根節點的父節點是這個頭結點。

而頭結點的左指針left指向整個樹的最左節點,也就是最小值

頭結點的右指針right指向整個樹的最右節點,也就是最大值

2.node_count記錄樹的大小

3.一個用於比較元素大小的仿函數

insert_equal()與insert_unique:

insert_equal容許RBTree中存在相同的節點,進行插入時,小於當前節點則向左走;等於或等於則向右走;若是有相同的元素,則插在相同元素的右側,好比9的右子節點有一個10,則在插入10就插入在這個10的右子節點

inert_unique不容許RBTree中存在相同的節點,在找到插入位置後,若是插入位置的父親節點的值與待插入節點(插入必定插在一個空子樹的位置)相同,則不插入.

 

Set

set的節點只擁有一個key值,所以是不能夠修改的,不然會破壞RBTree的結構。

Set的特性與list一致,當插入或刪除某個迭代器時,除了這個迭代器,其餘的迭代器都不會失效.

Set以紅黑樹爲底層,數據結構中存在一個紅黑樹變量t.

Map

map的節點是一個pair對,擁有key-value的特性,排序時根據key進行排序

與set同樣,對迭代器的插入或刪除不會影響其餘迭代器

MultiSet與MultiMap

set與multiset;map與mutimap的用法都一致,只是multiset和multimap使用的是insert_equal.

相關文章
相關標籤/搜索