优化地图上的初始化:转发密钥

时间:2013-11-15 16:15:42

标签: c++ c++11 hashmap initialization unordered-map

我有一个应该有趣的问题。我想在构建std::unordered_map时“转发初始化”项目。

这些是细节。我有一个从std::string到自定义类prop的哈希映射,在我的梦中,它会初始化一个成员变量,计算字符串传递给 {{的哈希值1}}。

这是我编写的一个方便的代码,但我不知道从哪里开始。

为什么这么麻烦?因为我想避免像“如果字符串不在容器中计算哈希值;用std::unordered_map::operator[]做事”。避免这种prop可能会影响我的表现。因此,当映射在容器中添加新项时,构造函数以及散列将仅执行一次。这会很棒。

任何提示?

谢谢&干杯!

if

1 个答案:

答案 0 :(得分:1)

只需使用prop类作为键,而不是字符串:

#include <iostream>
#include <string>
#include <unordered_map>

class prop
{
public:
    prop(std::string s = "") : s_(s), hash_(std::hash<std::string>()(s))
    {
        // Automagically forwarding the string in the unordered_map...
    };

    std::string s_;
    std::size_t hash_;
};

int main(int argc, const char * argv[])
{
    // Forward the std::string to the prop constructor... but how?
    std::unordered_map<prop, int, ...> map( ... );

    prop pABC( "ABC" ), pDEF( "DEF" ), pGHI( "GHI" );

    map[pABC] = 1;
    map[pDEF] = 2;
    map[pGHI] = 3;
    map[pGHI] = 9; 

    std::cout << map[pABC] << " : " << pABC.s_ << " : " << pABC.hash_ << std::endl;
    std::cout << map[pDEF] << " : " << pDEF.s_ << " : " << pDEF.hash_ << std::endl;
    std::cout << map[pGHI] << " : " << pGHI.s_ << " : " << pGHI.hash_ << std::endl;

    prop pXXX( "XXX" );
    std::cout << map[pXXX] << " : " << pXXX.s_ << " : " << pXXX.hash_ << std::endl;

    return 0;
}

我省略了自定义哈希和比较功能,没有它就应该明白这个想法。