标准容器(三)关联容器

        关联容器的插入insert不需要指定位置,由哈希表的哈希函数或者红黑树的规则自动确定插入位置。

参考:(16条消息) c++关联容器操作_c++关联式容器_Dαīsч的博客-CSDN博客

目录

无序关联容器

unordered_set 

unordered_multiset

unordered_map

unordered_multimap

有序关联容器

set 

multiset(key可重复)

map

multimap(key可重复)


无序关联容器

        链式哈希表 增删查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(),只能插入不同的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值