映射关键是自定义对象的位置?

使用STL C ++ hash_map ...

class MyKeyObject
{
    std::string str1;
    std::string str2;

    bool operator==(...) { this.str1 == that.str1 ... }
};

class MyData
{
    std::string data1;
    int data2;
    std::string etcetc;
};

喜欢这个...

MyKeyObject a = MyKeyObject(...);
MyData b = MyData(...);

stdext::hash_map <MyKeyObject, MyData> _myDataHashMap;
_myDataHashMap[ a ] = b;

我得到了一大堆错误。 这是前三个...

错误1错误C2784:'bool std :: operator <(const std :: _ Tree <_Traits>&,const std :: _ Tree <_Traits>&)':无法推导出'const std :: _ Tree <_Traits> &'from const MyKeyObject'c: program files microsoft visual studio 8 vc include functional 143

错误2错误C2784:'bool std :: operator <(const std :: basic_string <_Elem,_Traits,_Alloc>&,const _Elem *)':无法推断'const std :: basic_string <_Elem,_Traits, _Alloc>&'from'const Tasking :: MyKeyObject'c: program files microsoft visual studio 8 vc include functional 143

错误3错误C2784:'bool std :: operator <(const _Elem *,const std :: basic_string <_Elem,_Traits,_Alloc>&)':无法从'const MyDataObject'c推导出'const _Elem *'的模板参数c : program files microsoft visual studio 8 vc include functional 143

...

如果我把键设置为像int这样简单的一切都很好。

我究竟做错了什么?! 也许我需要用模板做些什么?

使用像这样的自定义键对象有没有更好的(更快?)的方式来访问数据?


请尝试以下操作,在VS 2005中为我工作。这是一个针对stdext命名空间中的VS2005内置hash_map类型以及boost unordered_map(首选)的解决方案。 删除不用的任何一个。

#include <boost/unordered_map.hpp>
#include <hash_map>

class HashKey
{
public:
    HashKey(const std::string& key)
    {
        _key=key;
    }
    HashKey(const char* key)
    {
        _key=key;
    }

    // for boost and stdext
    size_t hash() const
    {
        // your own hash function here
        size_t h = 0;
        std::string::const_iterator p, p_end;
        for(p = _key.begin(), p_end = _key.end(); p != p_end; ++p)
        {
            h = 31 * h + (*p);
        }
        return h;
    }
    // for boost
    bool operator==(const HashKey& other) const
    {
        return _key == other._key;
    }

    std::string _key;
};

// for boost
namespace boost
{
    template<>
    class hash<HashKey>
    {
    public :
        std::size_t operator()(const HashKey &mc) const
        {
            return mc.hash();
        }
    };
}

// for stdext
namespace stdext
{
    template<>
    class hash_compare<HashKey>
    {
    public :
        static const size_t bucket_size = 4;
        static const size_t min_buckets = 8;

        size_t operator()(const HashKey &mc) const
        {
            return mc.hash();
        }

        bool operator()(const HashKey &mc1, const HashKey &mc2) const
        {
            return (mc1._key < mc2._key);
        }
    };
}

int _tmain(int argc, _TCHAR* argv[])
{
    {
        stdext::hash_map<HashKey, int> test;
        test["one"] = 1;
        test["two"] = 2;
    }

    {
        boost::unordered_map<HashKey, int> test(8); // optional default initial bucket count 8
        test["one"] = 1;
        test["two"] = 2;
    }

    return 0;
}

要使用哈希表,您需要指定哈希函数。 您需要创建一个函数对象,该对象表示一个接受MyKeyObject对象并返回size_t的函数。 然后在初始大小之后传递函子作为第二个参数:

hash_map <MyKeyObject, MyData> _myDataHashMap(initial_size, YourHashFunctor());

或者,你可以写你的哈希函数作为的模板特hash<T>仿你的类型; 这样你就不需要传入自定义哈希函数。

我不知道你为什么明确地得到这些错误。 也许它试图使用你的对象作为哈希码或什么的? 无论如何,它不应该没有散列函数。 散列函数是为整数类型和字符串预定义的。


清楚地说明如何使用hash_map并创建您自己的散列函数。

(编辑:链接已删除,现在指向垃圾邮件页面)

链接地址: http://www.djcxy.com/p/68417.html

上一篇: map where the key is a custom object?

下一篇: Python subprocess.call blocking