c++ set与unordered set的区别

c++ std中set与unordered_set区别和map与unordered_map区别类似,其底层的数据结构说明如下:

1、set基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。

2、unordered_set基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存,无自动排序功能。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。

更详细的区别,如下图:

c++ set与unordered set的区别

set与unordered相比:

1、set比unordered_set使用更少的内存来存储相同数量的元素。

2、对于少量的元素,在set中查找可能比在unordered_set中查找更快。

3、尽管许多操作在unordered_set的平均情况下更快,但通常需要保证set在最坏情况下有更好的复杂度(例如insert)。

4、如果您想按顺序访问元素,那么set对元素进行排序的功能是很有用的。

5、您可以用<、<=、>和>=从字典顺序上比较不同的set集。unordered_set集则不支持这些操作。

一般来说,在如下情况,适合使用set:

1、我们需要有序的数据(不同元素)。

2、我们必须打印/访问数据(按排序顺序)。

3、我们需要知道元素的前任/继承者。

一般来说,在如下情况,适合使用unordered_set:

1、我们需要保留一组元素,不需要排序。

2、我们需要单元素访问,即不需要遍历。

3、仅仅只是插入、删除、查找的话。

示例:

set:

Input : 1, 8, 2, 5, 3, 9
Output : 1, 2, 3, 5, 8, 9

unordered_set:

Input : 1, 8, 2, 5, 3, 9
Output : 9 3 1 8 2 5 (顺序依赖于 hash function)

下面再给出一个以vector为key的示例,对比下set与unordered_set:

1 set<vector<int>> s;
2     s.insert({1, 2});
3     s.insert({1, 3});
4     s.insert({1, 2});
5 
6     for(const auto& vec:s)
7         cout<<vec<<endl;
8     // 1 2
9     // 1 3

因为vector重载了operator<,因此可以作为set的key。

但是如果直接使用unordered_set> s;则报错,因为vector没有hash函数,需要自己定义一个,可以定义一个类似下面这样的hash函数:

1 struct VectorHash {
 2     size_t operator()(const std::vector<int>& v) const {
 3         std::hash<int> hasher;
 4         size_t seed = 0;
 5         for (int i : v) {
 6             seed ^= hasher(i) + 0x9e3779b9 + (seed<<6) + (seed>>2);
 7         }
 8         return seed;
 9     }
10 };

接下来这样使用:

1 unordered_set<vector<int>, VectorHash> s;
2 s.insert({1, 2});
3 s.insert({1, 3});
4 s.insert({1, 2});
5 
6 for(const auto& vec:s)
7     cout<<vec<<endl;
8 // 1 2
9 // 1 3

或者模板特化struct hash>

1 namespace std {
 2     template<>
 3     struct hash<std::vector<int>> {
 4         size_t operator()(const vector<int> &v) const {
 5             std::hash<int> hasher;
 6             size_t seed = 0;
 7             for (int i : v) {
 8                 seed ^= hasher(i) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
 9             }
10             return seed;
11         }
12     };
13 }
14 
15 // usage example
16 void test_unordered_set(){
17     unordered_set<std::vector<int>> s;
18     s.insert({1, 2});
19     s.insert({1, 3});
20     s.insert({1, 2});
21     for(const auto& vec:s)
22         cout<<vec<<endl;
23     //    1 3
24     //    1 2
25 
26     std::hash<int> hasher;
27     cout<<"hasher(99): "<<hasher(99)<<" ,hasher(77): "<<hasher(77)<<endl;
28     // hasher(99): 99 ,hasher(77): 77
29 }

可以看到,在某些情况下,unordered_set的使用门槛还是挺高的。

Input : 1, 8, 2, 5, 3, 9

Output : 1, 2, 3, 5, 8, 9
原文链接: https://www.cnblogs.com/codingmengmeng/p/13992692.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/205123

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
adminadmin
0 0
c++ 打印时间
上一篇 2023年2月12日 下午10:07
c++ lambda表达式在标准库函数sort中的应用
下一篇 2023年2月12日 下午10:07

相关推荐

  • GSL – GNU Scientific Library 2023年2月8日
  • 并查集路径减半优化 UnionFind PathHalving (C++) 2023年3月1日
  • cocos2d关于glew32.lib错误(转) 2023年2月14日
  • 装饰器 2023年3月2日
  • 哈夫曼树——c++ 2023年2月15日
  • c++将字符转换成字符串 2023年2月15日
  • 15.3K

    我是职场上失宠的妃子

  • C++性能真的不如C吗?

    7.6K
  • 大话数据结构 高清PDF

    7.1K
  • string底层实现之SSO

    6.7K
  • 千百撸

    5.4K
  • GDB调试-从入门实践到原理

    4.2K
  • 什么是COM

    4.0K
  • std::string底层实现之COW(Copy-On-Write)

    3.9K
  • 智能指针-使用、避坑和实现

    3.9K
  • 彻底搞通TCP send和recv原理

    3.8K

玻璃钢生产厂家哪里有玻璃钢花盆玻璃钢雕塑型号仙桃玻璃钢花盆四川受欢迎的成都商场美陈酒店玻璃钢抽象艺术雕塑摆件简单的玻璃钢雕塑造型北京常见商场美陈哪里买莆田玻璃钢卡通雕塑价格范围美陈展示商场道具玻璃钢雕塑诗人兰州玻璃钢工艺品雕塑厂家玻璃钢雕塑招牌字制作成都创意玻璃钢雕塑批发信丰玻璃钢雕塑厂家贵阳玻璃钢园林小品雕塑浙江校园雕塑玻璃钢嘉兴玻璃钢装雕塑饰公司许昌玻璃钢景观雕塑公司玻璃钢花盆制品制作鼓楼商场美陈制作成都玻璃钢雕塑制造厂家福建商场圣诞美陈新乡彩绘玻璃钢雕塑价格厂家重庆玻璃钢美陈雕塑玻璃钢动物不锈钢雕塑定制百色玻璃钢泡沫雕塑华东耐腐蚀玻璃钢雕塑玻璃钢海洋雕塑单价公园卡通玻璃钢雕塑生产厂家黑龙江佛像玻璃钢雕塑价位香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化