我想为我的对象使用散列存储。这真的比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");
答案 0 :(得分:2)
为什么在只有一个密钥时使用Boost Multi-Index Container?如果您不打算尽快添加更多密钥,则应使用std::unordered_map
或std::map
。
关于哈希表与树木:
例如,unordered_map的GCC实现永远不会缩小其表,所以如果你添加了很多元素,然后删除大部分元素,那么你会留下一些具有相当糟糕的数据局部性(因此w.r.t.缓存性能较差)。算法哈希表可能很有吸引力,但在实际运行的系统中,它们可能表现出比树更差的性能,尤其是当元素数量为数百或更少时。
答案 1 :(得分:1)
完全匹配发现在任何但非极端退化的情况下,使用unordered_map(hash_map)中的散列键比std :: map的底层红黑树更快。
是的,你的代码应该是正确的,假设有一个哈希函数接受std :: string并返回其内容的哈希值。