关联容器的插入insert不需要指定位置,由哈希表的哈希函数或者红黑树的规则自动确定插入位置。
参考:(16条消息) c++关联容器操作_c++关联式容器_Dαīsч的博客-CSDN博客
目录
无序关联容器
链式哈希表 增删查o(1)
常见的哈希冲突的解决方法有五种,分别是线性探测法、开链法、再散列法、二次探测法、公共溢出区(频率较低),STL 采用的是开链法即每个表格维护一个list,如果hash函数计算出的格子相同,则按顺序存在这个list中。
hashtable 中的 bucket 是自己定义的,hashtable在设计之初内置了 28 个质数[53, 97, 193,...,429496729]。在创建 hashtable 时,会根据存入的元素个数选择不小于元素个数的那个质数来作为 hashtable 的容量(也就是bucket vector的长度),其中每个bucket所维护的 linked-list 长度也等于hashtable的容量。如果插入 hashtable 的元素个数超过了 bucket 的容量,就要进行重建table操作,即找出下一个质数,创建新的buckets vector,重新计算元素在新 hashtable 的位置。
为什么是质数?
选择质数作为哈希表的大小可以带来更均匀、更随机的键值对分布,减少冲突的发生,提高哈希表的性能和散列的均匀性。
为什么质数从53开始?
在实际的应用场景中,经验表明选择接近50的质数作为初始大小是一个相对较好的选择。这个大小既不会太小以致于造成过多的冲突,也不会太大以致于浪费过多的空间。
unordered_set
unordered_multiset
unordered_map
unordered_multimap
有序关联容器
红黑树 增删查o(log2n)2是底数(树得层数,高度)
set
所有元素都会根据元素的值自动被排序(默认升序)
set也不允许迭代器修改元素的值,其迭代器是一种constance_iterators,
map
map 中所有的元素都是pair类型,是一种所有元素会根据键值进行自动排序的数据结构。默认按照 key值升序 进行排列。
键值对:
插入操作:
map的operator[]:
1. 查询操作
2. 如果key不存在,他会插入一对数据[key,string]
find()
查询到返回迭代器位置,没查到返回尾部
multiset(key可重复)
multiset和set一样,底层实现都是一样的,只是在插入的时候调用的方法不一样,前者调用的是红黑树的insert_equal(),后者调用的则是独一无二的插入insert_unique()。
multimap(key可重复)
multimap和map的唯一区别就是:multimap调用的是红黑树的 insert_equal() 方法,可以实现元素的重复插入。而map调用的则是独一无二的插入 insert_unique(),只能插入不同的数据。