map/set/multi_map/multi_set/unorder_map/unorder_set总结

map/set/multi_map/multi_sep底层实现是加头节点的红黑树,元素之间有序,当存放的是自定义类型的时候要重载operator<,中序遍历的时候是有序的。增删查的时间复杂度都是O(lgN)

map存放的是键值对<key,value>,,key唯一,value可以重复,不能修改key的值,可以先删除旧的值,再添加新的值,value的值可以修改。

set用户存放的是值,但是底层存放的仍能存放的是键值对,只不过key=value,同样的值是唯一的,不能随便修改value.

mulit_map/multi_set与map/set相比,大部分都是相同的,只是存放的元素可以不唯一,可以重复。

set/multiset不区分键值和实值,其键值就是实值,会根据待定的排序准则,自动将元素排序。两者唯一的不同在于前者不允许元素重复(底层调rb_tree::insert_unique()),而后者允许(底层调用rb_tree::insert_equal())。 
和set相比,map/multimap同时拥有实值(value)和键值(key),其每一个元素都是pair<key,value>,pair的第一个元素是键值,第二个元素是实值。map和multimap的唯一区别在于,map不允许两个元素拥有相同的键值(底层调rb_tree::insert_unique()),而multimap允许存在重复的键值(底层调用rb_tree::insert_equal())。




unordered_map/unordered_set底层实现用了哈希表,

(1)unordered_set存放的是value,unorder_map也是存储的key-value的值,可以通过key快速索引到value,但是不会根据key的大小进行排序,增删查的时间复杂度都是O(1)

(2)同样不能修改key值当存放的是自定义的元素类型的时候,需要定义hash_value函数并且重载operator==,重载operator==是因为,如果两个元素的通过哈希函数计算出的值相同,并不能断定这两个元素就相同,必须再调用operator==。

(3)散列值相同的被存储在一个桶里。当散列容器中有大量数据时,同一个桶里的数据也会增多,造成访问冲突,降低性能。为了提高散列容器的性能,unordered库会在插入元素是自动增加桶的数量,不需要用户指定。但是,用户也可以在构造函数或者rehash()函数中,指定最小的桶的数量

unordered_map/unordered_set  与map/set结论:

运行效率方面:unordered_map/unordered_set 最高,而map/set效率较低但 提供了稳定效率和有序的序列。

占用内存方面:map/set内存占用略低,unordered_map/unordered_set内存占用略高,而且是线性成比例的。





引用提到,unordered_setset的使用方法很相似,唯一的区别在于unordered_set的元素是无序的。unordered_set是一种基于哈希表实现的集合容器,它可以快速地插入、删除和查找元素。而set是一种基于红黑树实现的集合容器,它会对元素进行自动排序。 引用提到,unordered_multiset和unordered_set的唯一区别在于插入操作的方式不同。unordered_multiset使用的是insert_equal,可以插入重复的元素,而unordered_set使用的是insert_unique,不允许插入重复元素。unordered_multiset和unordered_set都是无序容器,可以用来存储没有顺序要求的元素。 引用指出,实际上unordered_set和unordered_mapsetmap的使用方法基本没有区别。如果你已经熟悉了setmap的使用,那么很容易就能上手使用unordered_set和unordered_map。unordered_set和unordered_map是C++11中引入的新容器,它们都是基于哈希表实现的,可以提供常数时间的插入、删除和查找操作。 综上所述,unordered_set是一个无序集合容器,可以快速插入、删除和查找元素;unordered_multiset是一个允许插入重复元素的无序容器;两者与setmultiset的使用方法基本类似,只是内部实现和一些插入操作略有区别。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [unordered_set、unordered_map、unordered_multiset和unordered_multimap总结](https://blog.csdn.net/sinat_41619762/article/details/115268554)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [C++STL详解(六)unordered_set&unordered_map介绍](https://blog.csdn.net/a2076188013/article/details/126909121)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值