map 和 set 都是 C++ 的关联容器,其底层实现都是红⿊树(RB-Tree)。
由于 map 和 set 所开放的各种操作接⼝,RB-tree 也都提供了,所以⼏乎所有的 map 和 set 的操作⾏为,都只是转调 RB-tree 的操作⾏为。
map 和 set 区别在于:
(1) map 中的元素是 key-value (关键字—值)对:关键字起到索引的作⽤,值则表示与索 引相关联的数据; Set与之相对就是关键字的简单集合, set 中每个元素只包含⼀个关键字。
(2) set 的迭代器是 const 的,不允许修改元素的值; map允许修改value,但不允许修改 key。其原因是因为map和set是根据关键字排序来保证其有序性的,如果允许修改key的话,那首先需要删除该键,然后调节平衡,再插入修改后的键值,调节平衡,如此一来,严重破坏了map和set的结构,导致iterator失效,不知道应该指向改变前的位置,还是指向改变后的位置。所以STL中将set的迭代器设置成const,不允许修改迭代器的值;⽽map的迭代器则不 允许修改key值,允许修改value值。
(3) map⽀持下标操作, set不⽀持下标操作。 map可以⽤key做下标, map的下标运算符[ ] 将关键码作为下标去执⾏查找,如果关键码不存在,则插⼊⼀个具有该关键码和 mapped_type类型默认值的元素⾄map中,因此下标运算符[ ]在map应⽤中需要慎⽤, const_map不能⽤,只希望确定某⼀个关键值是否存在⽽不希望插⼊元素时也不应该使⽤, mapped_type类型没有默认值也不应该使⽤。如果find能解决需要,尽可能⽤find。