C++ STL 中unordered_map和map

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章