C++ STL 中unordered_map和map

本文详细对比了STL中的map与unordered_map在200万数据规模下的插入、查找与遍历效率,揭示了unordered_map在高频查询场景下的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL中unordered_map和map实现的原理不同:
map:采用的是红黑树来实现节点的保存,所有键值都是经过排序的存储的;
unordered_map:采用的数组+链表的形式保存的,根据不同的key的哈希值,存放到数组中不同的位置,然后使用链表来解决哈希值相同(冲突)的情况。
下面是对2000000条数据进行效率的对比情况:

#include <QtCore/QCoreApplication>
#include <unordered_map>
#include <map>
#include <string>
#include <QString>
#include <QDebug>
#include <QTime>

int main(int argc, char *argv[]) {
	QCoreApplication a(argc, argv);
	
	//1.unordered_map插入
	QTime timeUnorderedMapInsert;
	timeUnorderedMapInsert.start();
	std::unordered_map<std::string, QString> map1;
	for (int i = 0; i < 2000000; i++) {
		QString key = QString::number(i);
		map1[key.toStdString()] = QString::number(i);
	}
	qDebug() << QStringLiteral("unordered_map插入:") << "  " << timeUnorderedMapInsert.elapsed() << "ms";

	//2.unordered_map查找
	QTime timeUnorderedMapFind;
	timeUnorderedMapFind.start();
	QString str1 = map1["23"];
	qDebug() << QStringLiteral("unordered_map查找:") << str1 << "  " << timeUnorderedMapFind.elapsed() << "ms";

	//3.unordered_map遍历
	QTime timeUnorderedMapIt;
	timeUnorderedMapIt.start();
	for (auto it = map1.begin(); it != map1.end();it++) {
		QString str = it->second;
	}
	qDebug() << QStringLiteral("unordered_map遍历:") << "  " << timeUnorderedMapIt.elapsed() << "ms";

	//4.map插入
	QTime timeMapInsert;
	timeMapInsert.start();
	std::map<std::string, QString> map2;
	for (int i = 0; i < 2000000; i++) {
		QString key = QString::number(i);
		map2[key.toStdString()] = QString::number(i);
	}
	qDebug() << QStringLiteral("map插入:") << "  " << timeMapInsert.elapsed() << "ms";

	//5.map查找
	QTime timeMapFind;
	timeMapFind.start();
	QString str2 = map2["23"];
	qDebug() << QStringLiteral("map查找:") << str2 << "  " << timeMapFind.elapsed() << "ms";

	//6.map遍历
	QTime timeMapIt;
	timeMapIt.start();
	for (auto it = map2.begin(); it != map2.end(); it++) {
		QString str = it->second;
	}
	qDebug() << QStringLiteral("map遍历:") << "  " << timeMapIt.elapsed() << "ms";
	return a.exec();
}

第一次运行:
在这里插入图片描述
第二次运行:
在这里插入图片描述
通过时间记录可以看到,unordered_map在插入和查找的时候效率要优于map;
若考虑有序,查询速度稳定,考虑使用map。
若非常高频查询,内部元素不用排序,要考虑使用unordered_map。

aaa

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值