std::set/std::map簡介

來源:互聯網
上載者:User

std::set/std::map (以下用 std::map 代表) 是常用的關聯式容器,也是 ADT(抽象資料類型) 。也就是說,其介面(不是 OO 意義下的 interface)不僅規定了操作的功能,還規定了操作的複雜度 (代價/cost)。例如 set::insert(iterator first, iterator last) 在通常情況下是 O(N log N), N 是區間的長度;但是如果 [first, last) 已經排好序(在 key_compare 意義下),那麼複雜度將會 是 O(N)。

儘管 C++ 標準沒有強求 std::map 底層的資料結構,但是根據其規定的時間複雜度 ,現在所有的 STL 實現都採用平衡二叉樹來實現 std::map,而且用的都是紅/黑樹狀結構。《演算法導論(第 2 版)》第 12、13 章介紹了二叉搜尋樹和紅/黑樹狀結構的原理、性質、虛擬碼,侯捷先生的《STL 源碼剖析》 第 5 章詳細剖析了 SGI STL 的對應實現。本文對 STL 中紅/黑樹狀結構(rb_tree)的實現問了幾個稍微深入 一點的問題,並給出了我的理解。本文剖析的是 G++ 4.7 內建的這一份 STL 實現及其特定行為,與《 STL 源碼剖析》的版本略有區別。為了便於閱讀,文中的變數名和 class 名都略有改寫(例如 _Rb_tree_node 改為 rb_tree_node)。本文不談紅/黑樹狀結構的平衡演算法,在我看來這屬於“旁枝末節”( 見陳碩《談一談網路編程學習經驗》對此的定義),因此也就不關心節點的具體顏色了。

資料 結構回顧

先回顧一下資料結構教材上講的二叉搜尋樹的結構,節點(Node)一般有三個資料成 員(left、right、data),樹(Tree)有一到兩個成員(root 和 node_count)。

用 Python 表示:class Node:    def __init__(self, data):        self.left = None        self.right = None        self.data = data class Tree:    def __init__(self):        self.root = None        self.node_count = 0

而實際上 STL rb_tree 的結構比這個要略微複雜一些,我整理的代碼見 https://gist.github.com/4574621#file-tree-structure-cc 。

節點

Node 有 5 個成 員,除了 left、right、data,還有 color 和 parent。

C++實現,位於bits/stl_tree.h/** * Non-template code **/ enum rb_tree_color { kRed, kBlack }; struct rb_tree_node_base{  rb_tree_color       color_;  rb_tree_node_base*  parent_;  rb_tree_node_base*  left_;  rb_tree_node_base*  right_;}; /** * template code **/ template<typename Value>struct rb_tree_node : public rb_tree_node_base{  Value value_field_;};

見下圖。

color 的存在很好理解 ,紅/黑樹狀結構每個節點非紅即黑,需要儲存其顏色(顏色只需要 1-bit 資料,一種節省記憶體的最佳化措施是 把顏色嵌入到某個指標的最高位或最低位,Linux 核心裡的 rbtree 是嵌入到 parent 的最低位); parent 的存在使得非遞迴遍曆成為可能,後面還將再談到這一點。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。