再说set之前先说一下set和map之间的联系与区别:
set是一种关联式容器,其特性如下:
- set以RBTree作为底层容器
- 所得元素的只有key没有value,value就是key
- 不允许出现键值重复
- 所有的元素都会被自动排序
- 不能通过迭代器来改变set的值,因为set的值就是键
如果set中允许修改键值的话,那么首先需要删除该键,然后调节平衡,在插入修改后的键值,再调节平衡,如此一来,严重破坏了set的结构,导致iterator失效,不知道应该指向之前的位置,还是指向改变后的位置。所以STL中将set的迭代器设置成const,不允许修改迭代器的值
map和set一样是关联式容器,它们的底层容器都是红黑树,区别就在于map的值不作为键,键和值是分开的。它的特性如下:
- map以RBTree作为底层容器
- 所有元素都是键+值存在
- 不允许键重复
- 所有元素是通过键进行自动排序的
- map的键是不能修改的,但是其键对应的值是可以修改的
在map中,一个键对应一个值,其中键不允许重复,不允许修改,但是键对应的值是可以修改的
简单的介绍一下rb_tree:
1.是一种高度平衡的二叉树,所谓平衡是左臂和右臂相对一样长
2.插入数据的时候会自动排序,找到一个合适的位置插入
3.红黑树自身提供迭代器,可以从begin() ++ 到 end() 得到的是一个数据是有序的数据
4.前面我们说到对于set的key就是数据本身。所以我们不能用迭代器修改key
但是对于map key和数据是被独立的,所以我们可以修改数据,但是同样还是不能修改key
5.红黑树底层提供俩种插入:
insert_unique():要插入的key需要是独一无二的,否则插入失败
insert_equal(): 可以插入重复的key的数据,如果插入重复key 的节点,则会将该节点插入同key的相邻位置。
接下来看set的具体实现。