unordered_map vs vector +自定义散列,用于少量元素

时间:2016-09-26 23:36:29

标签: 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是基于节点的容器,我认为这种向量方法可以节省unordered_map所需的每个节点内存。此外,我假设内部hashmap将保证最快的检索,即使键是一个int。密钥范围很广,所以我不认为在这里使用向量会提高性能。对?任何评论/提示将不胜感激。

记忆不是问题。

2 个答案:

答案 0 :(得分:2)

  

内部地图键的范围非常大

这就是为什么hashmap在这里是正确的选择

  

但外部地图键只有10个不同的可能字符串

而且你在滥用hashmap。
用树(std::map)替换它。
(是的,如果你想自己写一个查找功能,可以选择std::vector
顺便说一下,你当你只有10个元素时,不应该关注空间复杂性主题:) 的更新
您的外容器的用途基本上是存储10个元素 这是一个很小的数字所以理论上你可以选择任何一个 你想要的cotainer(数组,树,哈希表) 所以你应该选择最合适的 选择是:

  • std::map:编写最少的代码,自动对元素进行排序
  • std::vector:最好地利用空间,但你应该自己编写一个查找函数
  • std::hashmap:从大炮射入麻雀。您不需要它提供的99%的功能。这个容器的目的与你的不同

答案 1 :(得分:0)

如果有人想知道,请使用

进行快速代码分析
vector<unordered_map<int, list<string>>
map<string, unordered_map<int, list<string>>
unordered_map<string, vector<unordered_map<int, list<string>>

vector的平均时间最快,其次是unordered_map,后跟map。