2013-09-19 3 views
0

Я пытаюсь создать хэш-карту, которая будет отображать std::string в std::string, до сих пор я использовал следующий код: Используйте libcds SplitListMap с стандом :: струнных

template<typename TKey, typename TValue> 
struct lockfree_hash_map_traits_t 
    : public cds::container::split_list::type_traits 
{ 

    typedef cds::container::michael_list_tag ordered_list ; // what type of ordered list we want to use 
    typedef std::hash<TKey>     hash   ; // hash functor for the key stored in split-list map 

    // Type traits for our MichaelList class 
    struct ordered_list_traits: public cds::container::michael_list::type_traits { 
     typedef std::less<TKey> less; // comparer that specifies order of list nodes 
    }; 
}; 

template<typename TKey, typename TValue> 
class lockfree_hash_map_t { 
public: 
    typedef 
     cds::container::SplitListMap<cds::gc::HP, TKey, TValue, lockfree_hash_map_traits_t<TKey, TValue> > 
     base_hash_map; 

// ... some stuff 
private: 
    base_hash_map _map; 
}; 

, который основан на libcds документации. Но я не уверен, правильно ли использую хэш-карту ... В соответствии с документом, который описывает SplitListMap , базовый список должен быть отсортирован по хешам ключей, но в документации предлагается использовать std::less<TKey> для указания заказа Майкла. Правильно ли используется std::less<std::string>?

ответ

0

Обычная практика для хэш-карты. Хеш-функция может генерировать один хэш-код для разных ключей. Он называется столкновением. Когда мы ищем ключ, мы вычисляем хэш для ключа, ищем этот хэш на карте (обычно хеш - это просто индекс в хеш-таблице), а затем сравниваем ключ элемента, найденный с нашим ключом. Поэтому необходим std :: less.

+0

Ссылаясь на этот вопрос, вы могли бы привести пример того, как инициализировать эту карту в основной функции и добавить один элемент? Я также искал в документации, просто записывая 'int2int_map name;' вызывает для меня исключение (ссылаясь на пример, приведенный в документе). –