STL中的Set和Map

先來看一段網絡上的文字描述:

STL中的Set和Map

上圖是一段關於 STL 中 Set 集合的描述,同樣的,也近似適合 Map 的描述。上述文字中,描述了最為重要的特徵:

Set 和 Map ,底層調用了紅黑樹的結構,並且實現的是一種自動平衡二叉搜索樹。

  • Set
STL中的Set和Map

平衡二叉搜索樹(Set)

如上圖, STL 中 Set 實現的本質是 平衡二叉搜索樹,且樹中沒有相同的元素 ,每一個節點表示 Set 中的一個元素, Set 中只有鍵,也就是上述圖中每個節點的值,就是 Set 的每個元素,因此 Set 中沒有重複元素, 當向 Set 中執行 insert (插入)時,樹會自動調整結構(對於紅黑樹而言,會實現節點的旋轉),以保證樹結構的平衡性 。當執行多次向節點中插入同一個鍵值時,比如 insert ( 5 ), insert ( 5 ),則只會執行第一次的 insert 操作。後續的插入,並不會執行,因為 Set 結構的樹中無重複元素。

另一個點在於, Set 中被插入的鍵不能被修改,也就是通過迭代器修改鍵值是不被允許的 。因為鍵值一旦被修改,就意味著樹的結構遭到了破壞,而這在最壞的情況意味著:整棵二叉樹遭到了破壞,甚至需要重構整棵二叉樹。即使在紅黑樹中,並沒有這樣的操作。因為紅黑樹的最為顯著的特徵為:局部調整。即對於 Set 而言,其 iterator 屬於 const-iterator 。

另外一個需要被注意的點在於:

STL中的Set和Map

我們使用迭代器來訪問容器是一件很平常的事情,上述代碼是一段使用極其平常的代碼,其作用是遍歷 Set 中所有的元素。 注意循環的終止條件是: ! = , 而不是: < 。 我們通常習慣了小於的小法:

即:

STL中的Set和Map

但這樣的寫法是錯誤的。

  • Map

下面來看 Map , Map 的結構形成機理和 Set 幾乎是一模一樣的,而 Map 的結構如下:

STL中的Set和Map

"掛件"平衡二叉搜索樹( Map )

Map 的結構如上圖:可見,

Set 相比, Map 只是多了一個"掛件" , 也就是常說的 Map 是由:鍵—值對構成的。 鍵充當了索引,值則記錄了一些其他內容 。而對於 Set 而言,只有鍵。或許我們用下面這個表來描述更為合適:

鍵—值對

索引序號 名字

1 張三

2 李四

3 王五

左邊的索引號就是鍵,右邊的名字就是值,所以說 Map 實際上是一種極為普遍簡單的概念。這種關係就像字典一樣。

而關於 Map 的其他性質,和 Set 是極其類似的。比如: 沒有相同的元素 ,當然對於 Map 而言,沒有相同的元素是隻沒有兩個元素鍵相同。執行兩個 insert ,仍然會只有鍵值對存在樹中,只是第二次執行的 insert 會修改第一次的 鍵 - 值對中的值。

同樣的, Map 中的鍵是不能被修改的 ,因為同樣會導致"重建樹"這個問題,但是很明顯的是,

值明顯是可以修改的 ,就像我們可以把上述索引序號為" 3 "的"王五"修改為"趙六";但我們不能將索引號 3 修改為 4, (我們只能將 3 刪除,再添加 4 ,這是可以的)。當然是用迭代器訪問時, 其也只能用 != ,而不是 <


分享到:


相關文章: