哈希和访问
Hashing and access
我想为我的对象使用散列存储。这真的比std::map<std::string, Object>
快吗?我是说搜索。据我所知,boost处理了很多优化。
我不确定我的代码是否正确。当搜索/插入等时,它真的使用散列键吗?
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");
当你只有一个键时,为什么你使用Boost多索引容器?如果您不打算很快添加更多的键,您应该只使用std::unordered_map
或std::map
。
对于哈希表和树:
例如,unordered_map的GCC实现从不收缩它的表,所以如果您添加了很多元素,然后删除了其中的大部分,那么您将得到一些具有非常糟糕的数据局部性的东西(因此w.r.t.缓存的性能很差)。从算法上讲,哈希表可能很吸引人,但在实际运行的系统中,它们的性能可能比树更差,特别是当元素数量为数百或更少时。精确匹配查找,除了最极端的退化情况,在unordered_map (hash_map)中使用散列键比在std::map的底层红黑树中更快。
是的,你的代码应该是正确的,假设有一个散列函数接受std::string并返回其内容的散列。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- 如何访问链式哈希表链表中的每个节点
- 编译哈希算法时出现内存访问冲突错误
- 0xC0000005:访问冲突读取位置0x00000000哈希函数
- 数组中的二叉搜索访问是否比使用哈希表更快
- 我应该如何访问 Boost SHA1 哈希
- 增强对哈希唯一索引的多索引访问
- 我可以(可移植)访问C++标准库的哈希实现吗?
- 哈希映射直接访问运算符[]
- 在c++中向哈希表中添加项会产生访问冲突异常
- 随机访问哈希映射值
- 快速访问哈希函数(不使用字符串对象)
- 如何访问数以百万计的位进行哈希
- c++哈希表和链表的访问冲突
- 哈希和访问
- 访问tr1/unordered_map的内部类型哈希函数