我們都知道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和 ...