c++ - unordered_map vs vector + 少量元素的自定义散列

标签 c++ vector hashmap unordered-map

目前我有一个嵌套的 HashMap 。内部映射键的范围非常大,但外部映射键只有 10 个不同的可能字符串。

unordered_map<string, unordered_map<int, list<string>>> nestedHashMap;

我切换到

会更有效率吗
vector<unordered_map<int, list<string>>> 

并拥有自己的哈希函数

static int hashFunc(string stringToBeHashed){
        switch(stringToBeHashed){
            case "example1":
                return 0;
            .
            .
            .
            case "example10":
                return 9;
            default:
                return -1;
        }
    }

在每次查找之前做我自己的散列?就空间复杂度而言,由于 unordered_map 是一个基于节点的容器,我认为这种 vector 方法可以为我节省一些 unordered_map 所需的每个节点内存。此外,我假设内部散列映射将保证最快的检索,即使键是一个 int。键的范围很大,所以我不认为在这里使用 vector 会提高性能。正确的?任何意见/提示将不胜感激。

内存在这里不是问题。

最佳答案

The inner map key has a very large range

这正是 hashmap 在这里是正确选择的原因

but the outer map key has only 10 different possible strings

而且您滥用了 HashMap 。
用树(std::map)代替。
(是的,如果你想写,你可以选择std::vector你自己一个查找函数)
顺便说一句,当你只有 10 个元素时,你不应该关心空间复杂度主题 :) 更新:
您的外部容器的用途基本上是存储 10 个元素。
这是一个很小的数字,所以理论上你可以选择任何东西
你想要的容器(数组、树、哈希表)。
所以你应该选择最合适的。
选项是:

  • std::map:代码最少,自动排序元素
  • std::vector:空间的最佳利用,但你应该自己写一个查找函数
  • std::hashmap:用大炮射出麻雀。您不需要它提供的 99% 的功能。此容器的用途与您的不同

关于c++ - unordered_map vs vector + 少量元素的自定义散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39713926/

相关文章:

python - 绑定(bind) C++ 和 Python 时,SWIG 在使用 MinGW-w64 的 Windows 上不起作用 : DLL load failed while importing: The specified module could not be found

C++ 如何断言 vector 中的所有 std::shared_ptr 都引用了某物

c# - 沿 3d 向量查找点

java - 在 HashMap 中的数组列表中搜索值

c++ - 为什么一个非常大的值会导致这段代码无限重复?

c++ - 在具有较旧 gcc/glibc/libstdc++ 的计算机上运行使用 gcc 4.7 编译的 C++11 可执行文件的问题

c++ - 位集、 bool vector 或简单大整数的整数 vector

Node.js Redis 获取 HashMap 中的所有值

java - 如何将文件读入以列表作为值的 HashMap ?

c++ - 在数组中搜索出现次数