2017-02-06 14 views
0

У меня есть std::unordered_mapmyMap с ключом, парами значений <Key*, Value>. Key определяется как так:Получить значение на карте для известного хэш-выхода

struct Key 
{ 
    unsigned long int UniqueValue; 
    unsigned long int NonnUniqueValue; 
} 

Остальная часть программы гарантирует, что UniqueValue является уникальным для каждого экземпляра Key, однако NonUniqueValue может отличаться между клавишами. Моя хэш-функция затем определяется как:

struct KeyHash 
{ 
    std::size_t operator()(const Key& k) const 
    { 
     return k.UniqueValue; 
    } 
} 

и моя карта затем:

std::unordered_map<Key*, Value, KeyHash> myMap; 

Таким образом, в принципе, каждый ключ уже знает, что это собственное значение хэш-функции. Я хочу, чтобы иметь возможность ссылаться на пару ключей, как на сам экземпляр Key, так и на номер UniqueValue. Поскольку значение хеша уже известно, могу ли я использовать его для прямого ссылочного значения?

Например, если у меня есть два экземпляра Keyk1 и k2 где k1.UniqueValue = 2, k2.UniqueValue = 5, k1.NonUniqueValue = 42 и k2.NonUniqueValue = 42, я хочу, чтобы иметь возможность ссылаться на значение в myMap с ключом k1 зная только k1.UniqueValue.

Это можно обойтись без прямого изменения Key?

ответ

0

Во-первых, незначительная точка. То, как вы объявили свой контейнер:

std::unordered_map<Key*, Value, KeyHash> myMap

делает ключ карты, чтобы быть указателя на Key структуру, а не значение.

Теперь, самый простой способ сделать то, что вам нужно, чтобы реорганизовать хэш-таблицу:

std::unordered_map< unsigned int /*unique_part_of_key*/, std::pair<unsigned int /*non_unique_part_of_key*/, Value>>

Чтобы сделать именно то, что вы просите, вам нужно добавить пользовательские KeyEqual предикат, игнорирует неединственную часть ключа, например, ваш KeyHash. Затем, вы можете создать фальшивый экземпляр ключа, со случайным неоднозначным значением, и использовать его для получения ссылки вам необходимо:

struct KeyEqual { bool operator(const Key& k1, const Key& k2) const { return k1.UniqueValue == k2.UniqueValue; } }; std::unordered_map<Key*, Value, KeyHash, KeyEqual> myMap{KeyHash(), KeyEqual()};

 Смежные вопросы

  • Нет связанных вопросов^_^