哈希和访问

时间:2011-04-10 13:46:12

标签: c++ boost hashtable multi-index

我想为我的对象使用散列存储。这真的比std::map<std::string, Object>快吗?我的意思是搜索。据我所知,推动过程进行了大量优化。

我不确定我的代码是否正确。在搜索/插入时是否真的使用散列键?

using boost::multi_index_container;
using namespace boost::multi_index;

struct Object
{
  std::string name;

  Object(std::string name_): name(name_) {}
};

typedef multi_index_container<
  Object,
  indexed_by<
    hashed_unique<
      BOOST_MULTI_INDEX_MEMBER(Object, std::string, name)
    >
  >
> ObjectSet;

ObjectSet objects;
objects.insert(Object("test1"));
objects.insert(Object("test2"));
objects.insert(Object("test3"));

// And testing:
objects.find("test2");

2 个答案:

答案 0 :(得分:2)

为什么在只有一个密钥时使用Boost Multi-Index Container?如果您不打算尽快添加更多密钥,则应使用std::unordered_mapstd::map

关于哈希表与树木:

例如,unordered_map的GCC实现永远不会缩小其表,所以如果你添加了很多元素,然后删除大部分元素,那么你会留下一些具有相当糟糕的数据局部性(因此w.r.t.缓存性能较差)。算法哈希表可能很有吸引力,但在实际运行的系统中,它们可能表现出比树更差的性能,尤其是当元素数量为数百或更少时。

答案 1 :(得分:1)

完全匹配发现在任何但非极端退化的情况下,使用unordered_map(hash_map)中的散列键比std :: map的底层红黑树更快。

是的,你的代码应该是正确的,假设有一个哈希函数接受std :: string并返回其内容的哈希值。