Q:STL中set底層實現方式? 為什么不用hash?
A: 第一個問題:set底層實現方式為RB樹(即紅黑樹)。
第二個問題:
首先set,不像map那樣是key-value對,它的key與value是相同的。關於set有兩種說法,第一個是STL中的set,用的是紅黑樹;第二個是hash_set,底層用得是hash table。紅黑樹與hash table最大的不同是,紅黑樹是有序結構,而hash table不是。但不是說set就不能用hash,如果只是判斷set中的元素是否存在,那么hash顯然更合適,因為set 的訪問操作時間復雜度是log(N)的,而使用hash底層實現的hash_set是近似O(1)的。然而,set應該更加被強調理解為“集合”,而集合所涉及的操作並、交、差等,即STL提供的如交集set_intersection()、並集set_union()、差集set_difference()和對稱差集set_symmetric_difference(),都需要進行大量的比較工作,那么使用底層是有序結構的紅黑樹就十分恰當了,這也是其相對hash結構的優勢所在。