rb_tree/hashtable下的容器对比

rb_tree下的容器---具备自动排序的功能

set/multiset

set/multiset以rb_tree为底层结构,以key排序,无法使用迭代器改变值(key和value都不能改变),因为key和value是二合一的;

set的key必须是独一无二的,不可以重insert使用底层insert_unique();(不可重复

multiset的key可以重复,其insert使用底层insert_equal();(可以重复

map/multimap

map/multimap以rb_tree为底层结构,以key排序,无法使用迭代器改变key但是可以改变value

map的key必须是独一无二的,不可以重insert使用底层insert_unique();(不可重复

multimap的key可以重复,其insert使用底层insert_equal();(可以重复

hashtable

hashtable刚开始会采用质数或者素数作为篮子的个数

空间充足时候放到对应的位置,空间不够的时候会余除列表长度放进去,如果之前有东西,就串在一起放进去(碰撞就变成链表放进去)

hash_function--标准库没有针对C++的有针对c语言的

hash_function是使映射出来的值足够乱,传出来的东西是hash_code,越乱越不容易发生哈希碰撞;hash_code是一个可以进行modudus运算的值;modudus是除了之后得到余数的值;

modudus的运算如下

hashtable下的容器---不具备自动排序的功能

hash_set(散列集合)

hash_map(散列映射表)

hash_multiset(散列多键集合)

hash_multimap(散列多键映射表)

hash_set同set一样,同时拥有实值和键值,且实值就是键值,键值就是实值;(不可重复

hash_map同map一样,每一个元素同时拥有一个实值(value)和一个键值(key),所以其使用方式,和上面的map基本相同。(不可重复

hash_multiset/hash_multimap的特性与上面的multiset/multimap完全相同,唯一的差别就是它们hash_multiset/hash_multimap的底层实现机制是hashtable(而multiset/multimap,上面说了,底层实现机制是RB-tree),所以它们的元素都不会被自动排序,不过也都允许键值重复。

       小结:set,同map一样,所有元素都会根据元素的键值自动被排序,因为set/map两者的所有各种操作,都只是转而调用RB-tree的操作行为,不过,值得注意的是,两者都不允许两个元素有相同的键值。

       不同的是:set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值,而map的所有元素都是pair,同时拥有实值(value)和键值(key),pair的第一个元素被视为键值,第二个元素被视为实值

        至于multiset/multimap,他们的特性及用法和set/map完全相同,唯一的差别就在于它们允许键值重复,即所有的插入操作基于RB-tree的insert_equal()而非insert_unique()。

C++11将hash_......改成了unordered_......

hash_set(散列集合)---unordered_set

hash_map(散列映射表)---unordered_map

hash_multiset(散列多键集合)---unordered_multiset

hash_multimap(散列多键映射表)---unordered_multimap

使用上面均一样

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳佳在学C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值