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