0

我尝试创建将映射std::string到的哈希映射,std::string到目前为止我使用了以下代码:

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>正确吗?

4

1 回答 1

0

哈希映射是通常的做法。散列函数可以为不同的键产生一个散列码。它被称为碰撞。当我们搜索一个键时,我们计算一个键的哈希,在映射中搜索这个哈希(通常哈希只是哈希表中的一个索引),然后将找到的项目的键与我们的键进行比较。所以 std::less 是必要的。

于 2013-09-22T17:47:07.533 回答