1. 程式人生 > >STL中的Set和Map

STL中的Set和Map

STL中的Set和Map

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

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

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

  • Set

平衡二叉搜尋樹(Set)

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

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

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

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

即:

但這樣的寫法是錯誤的。

  • Map

下面來看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,這是可以的)。當然是用迭代器訪問時,其也只能用!=,而不是<。