STL中的Set和Map 網絡
先來看一段網絡上的文字描述: spa
上圖是一段關於STL中Set集合的描述,一樣的,也近似適合Map的描述。上述文字中,描述了最爲重要的特徵: 3d
Set和Map,底層調用了紅黑樹的結構,而且實現的是一種自動平衡二叉搜索樹。 blog
平衡二叉搜索樹(Set) 索引
如上圖,STL中Set實現的本質是平衡二叉搜索樹,且樹中沒有相同的元素,每個節點表示Set中的一個元素,Set中只有鍵,也就是上述圖中每一個節點的值,就是Set的每一個元素,所以Set中沒有重複元素,當向Set中執行insert(插入)時,樹會自動調整結構(對於紅黑樹而言,會實現節點的旋轉),以保證樹結構的平衡性。當執行屢次向節點中插入同一個鍵值時,好比insert(5),insert(5),則只會執行第一次的insert操做。後續的插入,並不會執行,由於Set結構的樹中無重複元素。 it
另外一個點在於,Set中被插入的鍵不能被修改,也就是經過迭代器修改鍵值是不被容許的。由於鍵值一旦被修改,就意味着樹的結構遭到了破壞,而這在最壞的狀況意味着:整棵二叉樹遭到了破壞,甚至須要重構整棵二叉樹。即便在紅黑樹中,並無這樣的操做。由於紅黑樹的最爲顯著的特徵爲:局部調整。即對於Set而言,其iterator屬於const-iterator。 table
另一個須要被注意的點在於: 容器
咱們使用迭代器來訪問容器是一件很日常的事情,上述代碼是一段使用極其日常的代碼,其做用是遍歷Set中全部的元素。注意循環的終止條件是:!=,而不是:<。咱們一般習慣了小於的小法: 重構
即: 二叉樹
但這樣的寫法是錯誤的。
下面來看Map,Map的結構造成機理和Set幾乎是如出一轍的,而Map的結構以下:
"掛件"平衡二叉搜索樹(Map)
Map的結構如上圖:可見,同Set相比,Map只是多了一個"掛件",也就是常說的Map是由:鍵—值對構成的。鍵充當了索引,值則記錄了一些其餘內容。而對於Set而言,只有鍵。或許咱們用下面這個表來描述更爲合適:
鍵—值對
索引序號 |
名字 |
1 |
張三 |
2 |
李四 |
3 |
王五 |
左邊的索引號就是鍵,右邊的名字就是值,因此說Map其實是一種極爲廣泛簡單的概念。這種關係就像字典同樣。
而關於Map的其餘性質,和Set是極其相似的。好比:沒有相同的元素,固然對於Map而言,沒有相同的元素是隻沒有兩個元素鍵相同。執行兩個insert,仍然會只有鍵值對存在樹中,只是第二次執行的insert會修改第一次的 鍵-值對中的值。
一樣的,Map中的鍵是不能被修改的,由於一樣會致使"重建樹"這個問題,可是很明顯的是,值明顯是能夠修改的,就像咱們能夠把上述索引序號爲"3"的"王五"修改成"趙六";但咱們不能將索引號3修改成4,(咱們只能將3刪除,再添加4,這是能夠的)。固然是用迭代器訪問時,其也只能用!=,而不是<。