stl定义的关联容器有两种:set和map;除了set和map,有两种关联容器,虽然目前没有加入stl中,但用途非常大,
以后很有可能会加入stl,就是hash_set和hash_map。
set和map
set和map的底层都是用红黑树实现的,set容器只有键没有value,map的每一个键都对应一个值,他们的底层以及迭代器实现都
比较类似,明白了set,也就明白了map。
底层实现
set容器的底层是使用红黑树实现的,红黑树是一种平衡二叉查找树,红黑树以set的键值当作树的节点值,
这样一棵红黑树就代表一个set容器,(红黑树的插入,删除操作书上讲的很详细)。
例如set容器[80,75,85,90],对应的红黑树如下图所示:
迭代器实现
迭代器中要存储一个指向当前节点的指针,set迭代器有一点要注意,就是不能修改键值,因为加入修改了键的值,则会破坏红黑树的结构。
map迭代器可以修改value的值,但是不能修改键的值。set和map迭代器只定义了++和--操作,++操作会寻找下一个比当前节点大的值,--会寻找
下一个比当前节点小的值,因为红黑树是有序的,所以这两个操作也都不难实现。
迭代器如下图所示:
++操作后:
--操作后:
hash_set和hash_map
hash_set和hash_map底层是用hash表实现的,这是他们和普通set,map的最大不同之处。
以hash_set为例,来分析hash_set和hash_map的底层实现。
底层实现
hash_set的底层实现就是一个hash表,并且使用链表法来解决hash表的冲突。
对于一个[56,63,108,2,53,55]的hash_set,内部的结构如下图所示:
迭代器的实现
hash_set的迭代器中含有一个指向相应节点的指针,并且可以修改set的值。hash_set的迭代器只定义了++操作,就是指向hash表
中的下一个元素。
++操作之后:
总结
set,map和hash_se,hash_map的内部结构都不复杂,就是一个红黑树和一个hash表,明白了这两个结构,也就知道了
这四个容器对应的各种操作。