关于map、hash_map 和 unordered_map 的简单性能测试

【 C++ 】unordered_map和unordered_set的介绍和使用 目录 1、unordered系列关联式容器 2、unordered_map unordered_map的介绍 unordered_map的构造方式 unordered_map的函数接口说明 unordered_multimap 3、unordered_set unordered_set的介绍 unordered_set的构造方式 unordered_set的函数接口说明 阅读详情
测试环境:
DELL Latitude D610
CPU:Pentium-M 1.73 GHz
内存:2.00GB
OS:Windows 2003
开发环境: Visual Studio 2010
编译参数:/MD /Ox /Ot /W3 /D "_CRT_SECURE_NO_WARNINGS" /D "_CRT_NONSTDC_NO_WARNINGS" /link /MACHINE:X86 kernel32.lib

测试用代码:

#include <hash_map>
#include <unordered_map>
#include <map>
#include <string>
#include <iostream>
#include <ctime>
#include <windows.h>
using namespace std;

const int TEST = 100000;

class test_cls {
public:
	test_cls(){}
	test_cls(const string& s1, const string& s2, const string& s3, const string& s4, int n1, int n2):
			str1(s1), str2(s2), str3(s3), str4(s4), num1(n1), num2(n2){}
private:
	string str1;
	string str2;
	string str3;
	string str4;
	int num1;
	int num2;
};

template<typename T>
void test1(const string& test_str)
{
	T t;
	typedef typename T::value_type the_type;
	clock_t start = clock();
	for(int i = 0; i < TEST; ++i)
		t.insert(the_type(i, test_cls("s1", "s2", "s3", "s4", 1, 2)));
	cout << test_str << " insert:" << clock() - start << endl;
	
	start = clock();
	for(int i = 0; i < TEST; ++i)
		t.find(i);
	
	cout << test_str << " find:" << clock() - start << endl;
	
	start = clock();
	for(int i = 0; i < TEST; ++i)
		t.erase(i);
	
	cout << test_str << " erase:" << clock() - start << endl;
}

int main()
{
	test1<map<int, test_cls> >("map");
	::Sleep(1000);
	test1<hash_map<int, test_cls> >("hash_map");
	::Sleep(1000);
	test1<unordered_map<int, test_cls> >("unordered_map");

	return 0;
}

结果(为了减小误差,我对代码进行了10次测试):

map<int, test_cls>

次数插入查询删除
11251578
21251563
31251563
41251563
51091678
61091678
71251578
81251578
91251563
101251578

hash_map<int, test_cls>

次数插入查询删除
11253147
21253147
31251563
41253147
51253147
61251563
71253147
81093147
91253147
101103147


unordered_map<int, test_cls>

次数插入查询删除
11253147
21401662
31251563
41401662
51253147
61251563
71253147
81093147
91253147
101253147


        从上面的结果来看,map、hash_map 和 unordered_map在插入上性能差不多,但在查询上map的性能更好,而在删除上hash_map 和 unordered_map性能差不多。相比各类书籍和网上对 hash_map 和 unordered_map 与 map 的性能描述来说,似乎大相径庭。

        其实这在情理之中。因为,此处使用的key类型为int,对于数值型来说(包括;char、short、long)它们在map中排序(<) 和 hash_map 和 unordered_map中的散列值计算和比较(==)都是基于基本的内置运算,效率上没什么太大差异,因此,在插入上结果几乎相同,至于在查询上,之所以map较快,也是因为它只是对key在做简单<比较,而 hash_map 和 unordered_map 却要再次计算查询量的散列值而后再做==比较。至于删除,因为map内部是会对数据进行排序的,因此,相比hash_map 和 unordered_map不排序的而言,其在删除时除了要进行查询、移除、修正外还需要对数据结构进行调整


为了验证上述结论,我将key由int改为string:

#include <hash_map>
#include <unordered_map>
#include <map>
#include <string>
#include <iostream>
#include <ctime>
#include <cstdio>
#include <windows.h>
using namespace std;

const int TEST = 100000;

class test_cls {
public:
	test_cls(){}
	test_cls(const string& s1, const string& s2, const string& s3, const string& s4, int n1, int n2):
			str1(s1), str2(s2), str3(s3), str4(s4), num1(n1), num2(n2){}
private:
	string str1;
	string str2;
	string str3;
	string str4;
	int num1;
	int num2;
};

template<typename T>
void test1(const string& test_str)
{
	T t;
	typedef typename T::value_type the_type;
	clock_t start = clock();
	for(int i = 0; i < TEST; ++i)
		t.insert(the_type(i, test_cls("s1", "s2", "s3", "s4", 1, 2)));
	cout << test_str << " insert:" << clock() - start << endl;
	
	start = clock();
	for(int i = 0; i < TEST; ++i)
		t.find(i);
	
	cout << test_str << " find:" << clock() - start << endl;
	
	start = clock();
	for(int i = 0; i < TEST; ++i)
		t.erase(i);
	
	cout << test_str << " erase:" << clock() - start << endl;
}

template<typename T>
void test2(const string& test_str)
{
	T t;
	typedef typename T::value_type the_type;
	string* fill_str = new string[TEST];
	char tmp[10];
	for(int i = 0; i < TEST; ++i)
	{
		sprintf(tmp, "%d", i);
		fill_str[i] = tmp;
	}
	clock_t start = clock();
	for(int i = 0; i < TEST; ++i)
		t.insert(the_type(fill_str[i], test_cls("s1", "s2", "s3", "s4", 1, 2)));
	cout << test_str << " insert:" << clock() - start << endl;
	
	start = clock();
	for(int i = 0; i < TEST; ++i)
		t.find(fill_str[i]);
	
	cout << test_str << " find:" << clock() - start << endl;
	
	start = clock();
	for(int i = 0; i < TEST; ++i)
		t.erase(fill_str[i]);
	
	cout << test_str << " erase:" << clock() - start << endl;
}

int main()
{
	//test1<map<int, test_cls> >("map");
	//::Sleep(1000);
	//test1<hash_map<int, test_cls> >("hash_map");
	//::Sleep(1000);
	//test1<unordered_map<int, test_cls> >("unordered_map");
	
	test2<map<string, test_cls> >("map");
	::Sleep(1000);
	test2<hash_map<string, test_cls> >("hash_map");
	::Sleep(1000);
	test2<unordered_map<string, test_cls> >("unordered_map");

	return 0;
}

结果:

map<string, test_cls>

次数插入查询删除
120462141
220462141
318878140
418878140
520462141
620462141
718878125
820462141
918878141
1018878141

hash_map<string, test_cls>

次数插入查询删除
11563262
21573162
31573162
41413178
51573162
61573162
71573178
81573262
91573162
101573162

unordered_map<string, test_cls>

次数插入查询删除
11413147
21411662
31411563
41571563
51411662
61413147
71573147
81571563
91413147
101411662


        因此,在选择map、hash_map 和 unordered_map 时,除了要根据实际工作需要在速度和内存方面有所抉择以外。最主要的还是要看key的类型,如果key的类型是内置的数值型的话,完全可以考虑使用map,这样就可以鱼和熊掌兼得——既可以得到很好的效率,而且不必多费内存

焊缝缺陷智能检测:基于 YOLO 的工业质检系统实战 从焊缝缺陷数据集的构建到模型训练,从桌面检测界面到缺陷统计输出,本文覆盖了一套工业焊缝质检系统的完整路线。这个场景的核心难点在数据层面——气孔和裂纹这类小目标的标注质量直接决定了模型的最终表现。建议先在开源数据集上跑通全链路,确认 mAP 达到可接受的水平后,再通过补充特定类型的小目标数据和提升输入分辨率来做精度优化。工业场景中,漏检一个气孔的成本和误报一个假阳性的成本不一样——根据对两类成本的承受力,调整置信度阈值来找到业务上的最佳平衡点。 阅读详情

相关推荐

STM32MP157+AD7606BSTZ四通道IEPE传感器控制器实战(附电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器控制器设计实战,涵盖硬件架构、数据采集芯片对比、关键电路设计及信号处理算法。通过双核协同工作和优化算法,实现高精度振动监测与故障诊断,适用于工业机械状态监测等场景。

weixin_29171129的博客 367

map和unordered_map区别

map和unordered_map都是C++中的关联容器,用于存储键值对。其主要区别在于底层实现方式和性能表现。

qq_41979948的博客 9564

直线型一阶倒立摆1---从理论到实践的桥梁

本文深入探讨了直线型一阶倒立摆在控制理论中的核心地位,从非线性控制、鲁棒性到实时反馈等关键问题。通过实际案例和硬件搭建指南,帮助读者理解从理论到实践的过渡,特别适合控制工程初学者和研究人员。文章还提供了算法选型建议和硬件避坑手册,是掌握倒立摆控制的实用指南。

weixin_29047545的博客 318

unordered_map详解和性能分析

std::unordered_map是C++标准库中的一个关联容器,它可以存储一组键值对,并且支持快速的查找、插入和删除操作。class Ty,std::hash是一个模板类,它接受一个类型参数T,用于指定需要哈希的对象类型。还提供了一个函数调用运算符(operator()),用于计算对象的哈希值。perator()接受一个常量引用key,用于指定需要计算哈希值的对象。它返回一个类型的哈希值,表示对象在哈希表中的桶位置。实现一个哈希函数。

上官宏竹的专栏 2万+

LTSPICE使用教程:导入第三方库模型进行仿真

LTSPICE导入第三方SPICE模型进行仿真,以英飞凌的第三方.lib模型为实例进行详解

焊武大帝的专栏 3万+

最新首发——boss直聘爬虫

本文介绍了使用Python开发Boss直聘爬虫的核心思路和技术要点。通过模拟浏览器访问搜索页面获取Cookie,然后构建API请求获取职位数据。关键步骤包括:1)使用DrissionPage库初始化浏览器;2)模拟用户浏览行为获取必要参数;3)设置完整的请求头信息;4)通过POST请求获取JSON格式的职位数据。文章提供了详细的代码实现,包括浏览器模拟、API请求构建、数据处理等核心功能模块,并强调了最新版接口改为POST访问的特点。该爬虫可自动翻页采集数据并保存为Excel文件,适用于安全实习等职位信息的

2301_79735033的博客 3317

std::unordered_map和std::map性能区别和使用场景

(2)unordered_map实际上是hash_map的实现,理论上它的查询复杂度是O(1);(4)不要求有顺序的访问所有元素的情况下,我们应该尽量使用unordered_map;(3)当数据量不大,且我们需要有序的访问键值对时,可以考虑使用map;(1)map底层是采用红黑树实现的,它的查询复杂度是O(lgn);一万个元素插入,两者性能相差一倍。

li_danwang的专栏 915

100:vue+cesium: 加载glb文件,随机位置加载2000架飞机

本示例在 Vue + cesium 项目中随机位置加载2000架飞机,飞机是glb文件,每个大小为571kb。这个示例属于性能优化的范畴内,通常如果用entity加载glb只能显示几个飞机,这里采用primitive的方法来加载。直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果.

大剑师兰特的GIS世界 706

unordered_map和map的区别,从算法,底层实现原理区别,效率,桶树等结构等等多个层面解析(c++角度)

--而unordered_map底层实现是哈希表,它使用哈希函数将元素映射到桶中,可以在常数时间内完成基本操作,但是在最坏情况下,哈希冲突可能导致时间复杂度退化到O(n)。---由于map是基于红黑树实现的,它的插入、查找和删除操作的时间复杂度都是O(log n),相对于unordered_map而言,它在处理小规模数据时,性能表现较好。---而unordered_map是基于哈希表实现的,它的查找、插入和删除操作的时间复杂度都是O(1),相对于map而言,在处理大规模数据时,性能表现更好。

sanfengshaonian的博客 2508

【OpenClaw企业级智能体实战】第11篇:制造业设备预测性维护实战——OpenClaw+DeepSeek+Prometheus从零搭建(附完整代码)

本文聚焦制造业设备预测性维护的核心痛点,基于OpenClaw v2026.2.1、DeepSeek智能诊断、Prometheus监控等工具,拆解“设备状态监控→智能故障诊断→预测性维护”三大核心场景。从技术原理、算法构建、实操流程到完整代码实现,提供“数据采集→模型训练→智能调度→自动处置”的全链路方案。方案遵循工业安全规范,采用“只读优先、权限最小化”原则,适配中小制造企业落地需求。通过虚拟案例验证,可使设备非计划停机时间下降65%、平均修复时间缩短47%,既适合新手快速入门,也为进阶读者提供架构优化思路

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 606

Python李峋同款跳动的爱心(完整代码)

Python语言实现李峋同款可写字版跳动的爱心的完整代码。

AIGC 4万+

C++STL库 map与unordered_map性能比较

C++STL库 map与unordered_map性能比较

T_Y_F_的博客 2093

《Android最全面试题-Offer直通车》目录

如今Android求职是僧多粥少,竞争非常激烈,企业招聘时要求很高,本专栏汇聚android面试各种考点,各大公司Android面试题,《Android 最全面试题》将助你全方位提升,助您脱颖而出,早日拿到满意Offer。本专栏汇聚了海量优质内容,文章数量超过100 篇。凭借过硬的质量,每月新增订阅用户数以百计,如今仅需特惠价 9.9 元,限时抢购,后续将逐步恢复原价,早订阅早开启逆袭之旅。精心筹备,整理出一系列超万字精华篇章,累计数十万的 Android 面试题深度剖析。

大模型大数据攻城狮的专栏 2860

unordered_set和unordered_map的使用和哈希表的实现

unordered_set和unordered_map的使用和哈希表的实现!!!

学代码的咸鱼的博客 893

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

map unordered_map hash_map的查找性能测试

结论如下: Release模式下: 1. 容量为10的时候,查找效率:map > unordered_map > hash_map 2. 容量为100的时候,查找效率:map = unordered_map > hash_map 3. 容量为1000的时候,查找效率:unordered_map > hash_map > 4倍map 4. 容量为1万的时候,查...

papaya的博客 2743

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

哈希表进阶:挑战用哈希桶封装unordered_set和unordered_map,帮你深度理解迭代器!!!

深入哈希表底层进行讲解,包教包会!

Miun123的博客 1563

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++——STL——unordered_map与unordered_set的使用以及使用哈希表封装unordered_map/set

1.unordered_set的声明如上,Key就是unordered_set底层关键字的类型默认要求Key支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支 持将Key转成整形的仿函数传给第二个模板参数t默认要求Key支持比较相等,如果不支持或者想按自己的需求走可以自行实现支持 将Key比较相等的仿函数传给第三个模板参数底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给 第四个参数。5.⼀般情况下,我们都不需要传后三个模板参数。

2402_86667364的博客 1104

【C++】unordered_map和unordered_set的使用

unordered系列关联式容器在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到O(logN),即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。

Sxy_wspsby的博客 1338

C++中map/set和unordered_map/unordered_set的区别及其适用情况

文章目录map/set与unordered_map/unordered_set的区别map/set与unordered_map/unordered_set性能测试测试结论 map/set与unordered_map/unordered_set的区别 map/set与unordered_map/unordered_set性能测试 测试结论 根据测试结果可以得出以下结论: 当处理数据量小时,map/set容器与unordered_map/unordered_set容器增删查改的效率差异不大。 当处理数据量大时

2021dragon的博客 4325

C++ std map unordered_map hash_map 的查找性能测试代码及结果

测试结果 Release模式下: 查找效率:unordered_map ≈ hash_map > map std::map 的效率远小于 unordered_map 和 hash_map Debug模式下: 1. 查找效率:hash_map > unordered_map > map 2. 随着容量的增加,hash_map, unordered_map的查找效率有所降低,但浮动不大毕竟是常量级别。map的效率直线下降.... 详细数据见本文下方的 [测试过程记录](测试过程记录)

Echo的博客 2223

用unordered_map代替hash_map

利用unordered_map代替hash_map 实验环境 操作系统 fedora9编译器版本 gcc4.3 实验方式 各种map使用插入和查找,比较速度和相关性能 下面测试说明了速度之间的比较: map类型 插入速度 插入和查找速度 hashmap 0m0.123s 0m0.369s map

博学笃志-格物明德 1344

C++【哈希表的完善及封装】

关于哈希表的两种实现方法:闭散列、开散列 已经在上一篇文章中学习过了,闭散列 存在踩踏问题,十分影响效率,因此在实践中往往会选择更加优秀的 开散列,哈希表(开散列)又叫做 哈希桶,作为被选中的结构,我们需要对其进行改造,完善哈希桶,使其最终能封装出 unordered_set 和 unordered_map

北 海的博客 7761

map/unordered_map基础用法

map是STL里重要容器之一。 它的特性总结来讲就是:所有元素都会根据元素的键值key自动排序(也可根据自定义的仿函数进行自定义排序),其中的每个元素都是<key,value>的键值对,map中不允许有键值相同的元素, 因此map中元素的键值key不能修改,但是可以通过key修改与其对应的value。如果一定要修改与value对应的键值key,可将已存在的key删除掉,然后重新插入。 定义原型: 它作用应用场景可用作①字典 ②统计次数 相关操作 (1)插入操作 方式有...

weixin_36670529的博客 5076

Linux下map、hash_map、unordered_map性能比较

转载地址:https://blog.youkuaiyun.com/whizchen/article/details/9286557 原理介绍 map介绍 Map是STL[1]的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所

yolo_yyh的博客 675

【C++进阶】哈希 + unordered系列容器

介绍哈希及其unordered系列容器

Weraphael的博客 1005

【C++】Hash开散列,unordered_set(map) 的封装以及迭代器的实现

C++模拟实现unordered_set/map。Hash开散列(哈希桶)的实现并实现封装unordered_set/map,实现了unordered_set/map中的常用接口与迭代器。

Brant_zero的博客 2176
上一篇: 实现日期到农历五行八字转换
下一篇: Boost的fast_pool_allocator(pool_allocator)没有右值引用版的construct函数
耍宝王
博客等级 码龄17年 107粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值