繁体   English   中英

C++ std::unordered_map 比 std::map 慢?

[英]C++ std::unordered_map slower than std::map?

在下面的示例中,我期望unordered_mapmap快,但事实并非如此。 为什么会这样? unordered_map是否设计用于比常规 map 更快的其他目的?

#include <iostream>
#include <chrono>
#include <unordered_map>
#include <map>


int main()
{
    std::unordered_map<int, double> grid_unmap_int;
    std::map<int, double> grid_map_int;
    
    size_t map_size = 1e7;

    auto t1 = clock();
    for (size_t i = 0; i < map_size; ++i) {
        grid_unmap_int[i] = 1.0;
    }
    auto t2 = clock();


    for (size_t k = 0; k < map_size; ++k) {
        grid_map_int[k] = 1.0;
    }
    auto t3 = clock();

    std::cout << "Insertion \n";
    std::cout << "Filling unordered map int key: " << (t2 - t1) / static_cast<double>(CLOCKS_PER_SEC) << " seconds.\n";
    std::cout << "Filling map int key: " << (t3 - t2) / static_cast<double>(CLOCKS_PER_SEC) << " seconds.\n";
    std::cout << std::endl;

    t1 = clock();
    for (size_t i = 0; i < map_size; ++i) {
        double b = grid_unmap_int[i] ;
    }
    t2 = clock();


    for (size_t k = 0; k < map_size; ++k) {
        double b = grid_map_int[k];
    }
    t3 = clock();

    std::cout << "Retrieve \n";
    std::cout << "Filling unordered map int key: " << (t2 - t1) / static_cast<double>(CLOCKS_PER_SEC) << " seconds.\n";
    std::cout << "Filling map int key: " << (t3 - t2) / static_cast<double>(CLOCKS_PER_SEC) << " seconds.\n";


    return 0;
}

编辑:结果:在此处输入图像描述

在下面的示例中,我期望unordered_mapmap快,但事实并非如此。 为什么会这样?

情况可能是这样,因为std::map承诺对数查找时间,而std::ordered_map承诺平均查找时间恒定,最坏情况与容器大小成线性关系

这是一种奇特的说法,“它可能会更好,也可能会更糟。针对您的特定场景进行分析”。

unordered_map是否设计用于比常规map更快的其他目的?

是的。

std::map只能使用有序的密钥。 必须有一种既定的方法来对类型进行排序,例如您的示例中的int 作为回报,迭代std::map会为您提供该排序。

std::unordered_map只能使用定义了std::hash<Key>的键。 键不需要有既定的顺序(例如,它们可以是图像。或 colors。或声音。)但必须存在某种方法将值转换为哈希值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM