首先,我们明确一点,map和set是由红黑树一颗树来封装的。至于为什么,我们可以通过下图来进行判断
map的封装:
set的封装:
红黑树的模板:
我们可以看到红黑树通过传入一个模板来实现,实现map和set两个封装只需要传入不同的模板就可以实现。
map传入的是一个pair,而set只需要传一个值就行。
而红黑树的结构定义如下
通过传入的t不同这里的data也就不同,从底层实现不同的封装
仿函数:
由于红黑树的实现需要把T中的数据拿出来进行比较,但是由于这里的T是一个泛型,所以不知道是一个pair还是只有一个key,如果是pair就需要拿到pair.first进行比较,如果是key直接进行比较即可。
所以这里的封装需要传入第三个参数来帮助红黑树拿到key。如下图:
map的仿函数:
set的仿函数: