STL中map和set底層的紅黑樹實現

2021-08-10 15:12:53 字數 3665 閱讀 2918

我們都知道map和set的實現是依賴紅黑樹的

怎樣寫紅黑樹可以讓map和set都可以使用呢?

在這裡我們定義了乙個模版引數,如果它是key那麼它就是set,如果它是map,那麼它就是map;

我們分析一下,紅黑樹迭代器的前置++

到當前結點,就說明了它的左子樹和自己都已經訪問過了

1,當前位置,若右樹不為空,則訪問右樹的最左結點

2,當前位置,若右樹為空,則找祖先中孩子不是他的右

若右訪問完,那麼父親這棵樹也就訪問完了

前置–的演算法思想和++是近似的。

比較大小時,set直接比較它的key,而map是比較pair中的key

所以我們要新增加乙個模版引數keyofvalue

下面rbtree的**實現:

#include

#include

using namespace std;

enum color

;template

struct rbtreenode

};template

class rbtreeiterator

valuetype& operator*()

valuetype* operator->()

self

& operator++()

_node = leftleft;

}else

_node =

parent;

}return

*this;

}self operator++(int)

self

& operator--()

_node = rightright;

}else

_node =

parent;

}return

*this;

}self operator--(int)

bool operator==(const self

& s)

bool operator!=(const self

& s)

};template

class rbtree

iterator begin()

return iterator(left);

}iterator end()

iterator rbegin()

return right;

}iterator rend()

pair

insert(const valuetype& v)

keyofvalue keyofvalue;

node*

parent

=null;

node* cur = _root;

while (cur)

else

if (keyofvalue(cur->_valuefield) < keyofvalue(v))

else

}//找到插入位置

cur =

new node(v);

node* newnode = cur;//記錄cur,後面的操作會改變cur

if (keyofvalue(parent

->_valuefield) < keyofvalue(v))

else

while (parent

&&parent

->_col == red)

else

//uncle不存在,或uncle為黑色

rotater(grandparent);

parent

->_col = black;

grandparent->_col = red;

break;}}

else

//parent == grandparent->_right

else

//uncle不存在或者為黑色

rotatel(grandparent);

parent

->_col = black;

grandparent->_col = red;

//break;}}

}_root->_col = black;

return make_pair(iterator(newnode), true);

}iterator find(const k& key)

else

if ((keyofvalue(cur->_valuefield)) < key)

else

}return iterator(null);

}void rotatel(node*

parent)

subr->_left =

parent;

node* parentparent =

parent

->_parent;

parent

->_parent = subr;

if (parentparent ==

null)

else

else}}

void rotater(node*

parent)

subl->_right =

parent;

node* parentparent =

parent

->_parent;

parent

->_parent = subl;

if (parentparent ==

null)

else

else}}

private:

node* _root;

};

set**實現:

#include

#include

#include"rbtree.h"

using

namespace

std;

template

class set

struct keyofvalue//在類外需要在定義模版引數

};typedef

typename rbtree::iterator iterator;

iterator begin()

iterator end()

iterator rbegin()

iterator rend()

iterator find()

pairbool> insert(const k& key)

private:

rbtree_s;

};void testset()

cout

<< endl;

}

map**的實現:

#pragma once

#include "rbtree.h"

template

struct mapkeyofvalue

};template

>

class map

iterator end()

bool insert(const pair& value)

v& operator(const k& key)

protected:

rbtree, keyofvalue> t;

};

STL中map和set底層的紅黑樹實現

我們都知道map和set的實現是依賴紅黑樹的 怎樣寫紅黑樹可以讓map和set都可以使用呢?在這裡我們定義了乙個模版引數,如果它是key那麼它就是set,如果它是map,那麼它就是map 我們分析一下,紅黑樹迭代器的前置 到當前結點,就說明了它的左子樹和自己都已經訪問過了 1,當前位置,若右樹不為空...

stl中set和hash set底層實現詳解

set和hash set是stl中比較重要的容器,有必要對其進行深入了解。在stl中,set是以紅黑樹 rb tree 作為底層資料結構的,hash set是以hash table 雜湊表 作為底層資料結構的。set可以在時間複雜度為o logn 情況下插入 刪除和查詢資料。hash set操作的時...

STL中的map底層預設比較

template class map其中 key表示比較的鍵 key tp表示值 value compare表示比較方式,alloc表示記憶體分配器。一般我們在寫map的時候總是類似於寫出如下 map my map new map 表示鍵為int型別,值為字串型別。這裡之所以不對 compare和 ...