STL中的Set和Map

STL中的Set和Map 網絡

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

上圖是一段關於STLSet集合的描述,一樣的,也近似適合Map的描述。上述文字中,描述了最爲重要的特徵: 3d

SetMap,底層調用了紅黑樹的結構,而且實現的是一種自動平衡二叉搜索樹。 blog

  • Set

平衡二叉搜索樹(Set) 索引

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

另外一個點在於,Set中被插入的鍵不能被修改,也就是經過迭代器修改鍵值是不被容許的。由於鍵值一旦被修改,就意味着樹的結構遭到了破壞,而這在最壞的狀況意味着:整棵二叉樹遭到了破壞,甚至須要重構整棵二叉樹。即便在紅黑樹中,並無這樣的操做。由於紅黑樹的最爲顯著的特徵爲:局部調整。即對於Set而言,其iterator屬於const-iterator table

另一個須要被注意的點在於: 容器

咱們使用迭代器來訪問容器是一件很日常的事情,上述代碼是一段使用極其日常的代碼,其做用是遍歷Set中全部的元素。注意循環的終止條件是:!=而不是:<咱們一般習慣了小於的小法: 重構

即: 二叉樹

但這樣的寫法是錯誤的。

  • Map

下面來看MapMap的結構造成機理和Set幾乎是如出一轍的,而Map的結構以下:

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

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

鍵—值對

索引序號

名字

1

張三

2

李四

3

王五

左邊的索引號就是鍵,右邊的名字就是值,因此說Map其實是一種極爲廣泛簡單的概念。這種關係就像字典同樣。

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

一樣的,Map中的鍵是不能被修改的,由於一樣會致使"重建樹"這個問題,可是很明顯的是,值明顯是能夠修改的,就像咱們能夠把上述索引序號爲"3"的"王五"修改成"趙六";但咱們不能將索引號3修改成4,(咱們只能將3刪除,再添加4,這是能夠的)。固然是用迭代器訪問時,其也只能用!=,而不是<

相關文章
相關標籤/搜索