在stl中。set与map的底层用的底层都是将红黑树的接口进行在一次的封装就形成了set和map.
值的注意的是,红黑树的传入参数为<K,V, KOfValue>,K,V就是常见的KV模型,实际存储中V就是存储的类型,如set中V就是K,因为set只用key值,对于map,V就是pair<K,V>。KOfValue是一个仿函数。用来拿到V中的key值,因为对于set来讲,可以直接拿到k,但是map就不可以。为了实现接口得一致性,在这里插传入一个仿函数。
红黑树封装set
#pragma once
namespace tk
{
template<class K>
class set
{
typedef K ValueType;
struct KeyOfValue
{
const K& operator()(const ValueType& data)
{
return data;
}
};
typedef RBTree<ValueType, KeyOfValue> RBTree;
typename typedef RBTree::iterator iterator;
public:
set() : t() {}
// iterator: begin/end
iterator begin() {
return t.Begin();
}
iterator end() {
return t.End();
}
//
// capacity
bool empty()const {
return t.Empty();
}
size_t size()const {
return t._Size();
}
///
// modify
pair<iterator, bool> insert(const ValueType& data) {
return t.Insert(data);
}
void clear() {
t.Clear();
}
iterator find(const K& key) {
return t.Find();
}
private:
RBTree t;
};
}
红黑树封装map
#pragma once
namespace tk
{
template<class K, class V>
class map
{
typedef pair<K, V> ValueType;
struct KeyOfValue
{
const K& operator()(const ValueType& data)
{
return data.first;
}
};
typedef RBTree<ValueType, KeyOfValue> RBTree;
typename typedef RBTree::iterator iterator;
public:
map() : t() {}
/
// iterator:beign和end
iterator begin() {
return t.Begin();
}
iterator end() {
return t.End();
}
///
// capacity
bool empty()const {
return t.Empty();
}
size_t size()const {
return t._Size();
}
///
// access
V& operator[](const K& key) {
return (*(t.Insert(pair<K, V>(key, V())).first)).second;
}
///
// modify
pair<iterator, bool> insert(const ValueType& data) {
return t.Insert(data);
}
void clear() {
t.Clear();
}
iterator find(const K& key) {
return t.Find();
}
private:
RBTree t;
};
}