map與set底層都是調用的RBTreenode
首先看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的節點只擁有一個key值,所以是不能夠修改的,不然會破壞RBTree的結構。
Set的特性與list一致,當插入或刪除某個迭代器時,除了這個迭代器,其餘的迭代器都不會失效.
Set以紅黑樹爲底層,數據結構中存在一個紅黑樹變量t.
map的節點是一個pair對,擁有key-value的特性,排序時根據key進行排序
與set同樣,對迭代器的插入或刪除不會影響其餘迭代器
set與multiset;map與mutimap的用法都一致,只是multiset和multimap使用的是insert_equal.