一、Set/MutiSet
Set和Mutiset都是基于RB-tree的一种容器,所以严格意义上两者都算是容器适配器(container adaptor),所以它们的源代码也是在rb_tree的参数列表和迭代器上进行限制,来实现自身的功能特性。
下面是set的源代码,可以看到它把原来rb-tree的value、identity作了默认处理,这样实现它的键值一体和取值方式统一,要注意的还有它的迭代器是const_iterator,即只能迭代而不能修改键值,前面讲rb-tree是可以改的,但不建议修改。至于它的成员函数,全都是转调rb-tree的,像前面的stack和qunue一样。
二、Map/MutiMap
Map和MutiMap也基于rb-tree,和 set 一样,mutimap使用的是rb-tree提供的insert_equal,其他与map并无二致。
源代码对rb-tree的改动:(1)Value使用pair封装,并将Key const化,使键值不可修改(2)它的取值方式使用select1first( )函数,它的代码如下下图
对于map独特的地方是它的[]运算符重载,下图右上角英文的表达是指如果能找得到key,就把key里的data传回去,如果找不到,就自己插一个值进去,这个插入的data就是要找的key值,从左下角的源代码可以看到,是有一个版本区别的,2011版本之前的用insert,之后的用那一长串Unique插入。这里有一处区别是:mutimap放元素只能用insert,而map可以使用中括号[]来放元素。