概述
STL 中的 map 和 set 本质上是对红黑树的定制化封装。红黑树作为通用骨架,通过提取键的规则(KeyOfT)、迭代器权限控制以及键值修改限制,分别适配了'键值对存储'和'单一元素去重排序'的需求。
map 和 set 的封装差异
在封装时,对红黑树内部 K(Key)和 T(Value)的处理有所不同:
- map: K 存储 Key,T 存储
pair<Key, Value>。K 用于排序查找,Value 用于存信息。K 不可修改,Value 可修改。 - set: K 存储 Key,T 也存储 Key。两者相同,主要用于去重和排序。K 和 T 均不可修改。
map 实现示例
namespace stl_impl {
template<class K, class V>
class map {
struct MapKeyOfT {
const K& operator()(const std::pair<K, V>& kv) {
return kv.first;
}
};
public:
typedef typename RBTree<K, std::pair<const K, V>, MapKeyOfT>::iterator iterator;
typedef typename RBTree<K, std::pair<const K, V>, MapKeyOfT>::const_iterator const_iterator;
iterator begin() { return _t.begin(); }
iterator end() { return _t.end(); }
const_iterator begin() const { .(); }
{ .(); }
V& []( K& key) {
std::pair<iterator, > ret = (std::(key, ()));
ret.first->second;
}
{
.(kv);
}
:
RBTree<K, std::pair< K, V>, MapKeyOfT> ;
};
}


