【C++】map和set的封装

文章目录

1. 在STL中的map与set

在STL中,map和set都是使用的红黑树

map与set在STL中实现是一样的
对于value_type,map的第二个模板参数是pair,而set的第二个模板参数是key
这样写是为了map和set使用同一颗红黑树去复用map和set

set < K > -> rb_tree<K,K>
map<K,V> – > rb_tree<K,pair<const K,V>>

第一个模板参数拿到单独K的类型,使用Find erase接口函数的参数是K
第二个模板参数决定了树的节点是 K 类型 or K V类型

2. 修改自己实现的红黑树

在上一篇文章中 ,实现了红黑树的插入等接口功能,
但是只能对于K V使用,修改模板参数使K或者 K V 都能调用
点击查看: 自己实现的红黑树

修改结构定义

原本自己实现的红黑树 模板为 template<class K,class V>
第一个参数代表 key ,第二个参数 代表 value

把第二个参数 改为 T 即 template<class K,class T>
按照STL的写法,使用第二个模板参数决定树的节点

原本的kv包含K V ,但是由于要调用map 和set,所以不知道到底传过来的是什么
所以使用 模板类型的 data 代替

在结构定义时,为了让map与set都能调用同一颗红黑树,所以把模板参数改为T
当set要调用时,T变为<K,K>
当map要调用时,T变为<K,pair<const K,V>>

红黑树的insert中如何取到key

在insert中由于不知道data代表的是 pair还是K ,所以不能够取first
pair 虽然能够比较,但是不符合预期,所以要自己实现一个仿函数

我们要把key取出来,但是在红黑树中并不知道调用的是 set 还是map,无法知道T代表什么
但是在使用set或者map内部是知道的,所以 分别在map和set内部各自创建一个内部类,其中都写一个operator()

在函数模板中添加一个参数,即可找到对应map/set的key值

在红黑树内部,使用类实例化一个对象kot,通过kot去调用map/set 中相同的operator() ,取出对应的key值

迭代器

set/map的迭代器是红黑树内部的迭代器

第二个模板参数Ref 第三个模板参数Ptr都是为了迭代器与const迭代器传参时有不同的参数存在,
从而区分普通迭代器与const迭代器

在list的模拟实现中有详细解释 关于 参数Ref 与Ptr 以及operator != -> * 的基本相似的使用

点击查看: 迭代器详细解释

operator++

版权声明:本文为博主作者:风起、风落原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_62939852/article/details/130675223

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月29日
下一篇 2023年12月29日

相关推荐