1

my のキーstd::unordered_mapboost::uuids::uuids であるため、128 ビット ハッシュは一意と見なされます。ただし、コンパイラはそれを知ることができないため、これを言います。

error C2338: The C++ Standard doesn't provide a hash for this type.

マップでキーをそのままハッシュとして使用するにはどうすればよいですか? ちなみに、は私のシステムでstd::size_tは定義されunsigned int __w64ていますが、これは 64 ビットのみを指していると思います。

4

4 に答える 4

1

type のハッシュ関数を提供する必要がありますboost::uuids::uuid。一意であるため、stl ID をそのまま使用できます。

unordered_map の宣言は次のとおりです。

template < class Key,                                    // unordered_map::key_type
           class T,                                      // unordered_map::mapped_type
           class Hash = hash<Key>,                       // unordered_map::hasher
           class Pred = equal_to<Key>,                   // unordered_map::key_equal
           class Alloc = allocator< pair<const Key,T> >  // unordered_map::allocator_type
           > class unordered_map;
于 2013-08-31T13:24:45.543 に答える
0

std::unordered_mapUUIDの長さは128ビットであるのに対し、マップのハッシュはstd::size_t64ビットしか保持できないため、 UUIDをキーとして使用する方法が見つかりませんでした。

代わりに、型に格納できuint64_t、標準ライブラリのコンテナーによってネイティブにサポートされる 64 ビット ID のみに対して、実際の 128 ビット UUID を削除しました。

于 2013-08-31T19:33:21.137 に答える
0

std::hash最も簡単な方法は、同じ入力を返すその型の特殊化を実装することだと思います。

namespace std
{
    template<>
    struct hash<Foo>
    {
        Foo operator(const Foo& foo)
        {
            return foo;
        }
    };
}

この例の型Fooが暗黙的に に変換可能であると仮定しstd::size_tます。

あなたの場合、型は 128 ビットの GUID で、std::size_t32 ビットまたは 64 ビットを使用します。128 ビットの GUID を 64/32 ビットの部分に分割し、値を組み合わせることができます。

于 2013-08-31T13:26:57.000 に答える