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
使用上面均一样