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