C++ 封装红黑树实现 MyMap 与 MySet
在深入关联式容器之前,我们需要理解其底层数据结构。本文基于红黑树(Red-Black Tree),模拟实现 C++ STL 中的 std::map 和 std::set。我们将先梳理红黑树的核心规则与基础操作(插入、删除、旋转),再基于红黑树的底层结构,分别设计 MyMap(适配键值对存储)和 MySet(适配单一键存储)的核心接口。
1. 源码及框架分析
参考 SGI STL 30 版本源代码,map 和 set 的源码主要在 stl_map.h、stl_set.h 和 stl_tree.h 等头文件中。核心结构如下:
// stl_set.h
template<class Key, class Compare = less<Key>, class Alloc = alloc>
class set {
public:
typedef Key key_type;
typedef Key value_type;
private:
// identity<value_type> 用于从 value 中提取 key,因为 set 中 value 就是 key
typedef rb_tree<key_type, value_type, identity<value_type>, key_compare, Alloc> rep_type;
rep_type t; // 红黑树实例
};
// stl_map.h
template<class Key, class T, class Compare = less<Key>, class Alloc = alloc>
class map {
public:
typedef Key key_type;
typedef T mapped_type;
typedef pair<const Key, T> value_type;
private:
// select1st<value_type> 用于从 pair 中提取第一个元素 (Key)
typedef rb_tree<key_type, value_type, select1st<value_type>, key_compare, Alloc> rep_type;
rep_type t; // 红黑树实例
};


