如果我只想指定哈希函数,我应该传递给unordered_map的存储桶计数参数什么?
What should I pass to unordered_map's bucket count argument if I just want to specify a hash function?
c++ 11的unordered_map
的默认构造函数是这样的:
explicit unordered_map( size_type bucket_count = /*implementation-defined*/,
const hasher& hash = hasher(),
const key_equal& equal = key_equal(),
const allocator_type& alloc = allocator_type() );
我想用自定义散列函数创建一个unordered_map
,但它是构造函数的第二个参数。
我应该使用多少桶数?是否有一个神奇的值,我可以用它来告诉容器自己决定?否则,是否存在一种启发式方法,我可以根据我期望映射包含的键的数量来猜测一个好的桶号?我应该在意吗?
我不会太担心的。
容器保证桶计数至少您提供的值,也就是说,如果需要,它将增加它。你可以传递0作为桶计数,实现将会做像std::max(count, 10)
这样的事情并覆盖零值,或者它只会在第一次插入时重新散列。
另一种选择是从默认构造的对象中复制值:
H hasher;
unordered_map<K,T,H,P> m{ unordered_map<K,T,H,P>{}.bucket_count(), hasher };
这将把桶计数设置为实现的默认值(但确实要求H
哈希函数类型为DefaultConstructible)。
FWIW GCC的unordered_map
将10作为您所展示的构造函数的默认值(因此这可能也是合理的默认值),并将0用于接受一对迭代器或initializer_list
的构造函数。
unordered_map的模板参数之一是散列函数。如果你在那里指定了你的哈希函数对象,你可以让构造函数参数保持默认设置。
相关文章:
- 使用 std::map 存储在 std::any 中,然后通过 std::any_cast 访问
- 将对象存储在 std::map 中
- 存储在 std::map/std::set 中,与在存储所有数据后对向量进行排序
- 将字符指针按顺序存储在 map 中 std::map<char*, int> mymap。将其存储为字符或字符串不是一个选项
- 关于从第二个存储值_ty2秒复制std :: Map Iterator的数据的问题
- 在C STL :: MAP内部节点中存储的内容
- 如何在三维数组中使用std::map来存储/检索具有特定值的键
- 如何在 std::map 中存储"对象类型"?
- std::map设计:使用std::字符串作为map键和存储的对象名称(成员)
- 在“std::map”中插入一个“int”值,该值应该存储“std::string”
- 如何在 Map 中存储集合容器的迭代器列表
- 将结果存储在 C++Map 中,然后迭代它,然后打印出来
- 如何将结果存储在 Map 中 C++,然后迭代它,然后打印出结果
- c ++如何使用boost xml解析器读取XML并存储在map中
- 我应该如何使用 std::map<> 来聚合/组合存储在数组C++中的数据?
- 带有map C++程序没有提供与上次存储相同的资源
- 在 std::map 中存储指向派生类实例的指针
- 将boost::bind函数存储在std::map中
- 在std::set/std::map中存储具有多个不同类型字段的c++对象的有效方法
- 重载"<"要存储的<map>类的运算符