使用 std::unordered_map<int, int> 而不是 std::map<int, int> 有意义吗?
Does it make sense to use std::unordered_map<int, int> instead of std::map<int, int>?
std::unordered_map<int, int>
应该比std::map更快吗?我不在乎顺序,只关心快速查找,所以我认为我应该使用哈希表。但后来我想也许它会尝试另外散列我的密钥或类似的东西(我不需要(?
还有一个相关的问题:我需要通过int
键检索int
值。我应该使用 unordered_map<int, int>
还是 unordered_set<pair<int, int> >
(在这种情况下,我需要为我的对正确实现哈希函数(?
map<T,K>
和unordered_map<T,K>
之间的区别在于,第一个实现依赖于树,而第二个实现依赖于哈希映射。
这意味着基本操作(获取和设置(的复杂性对于map
是对数的,对于unordered_map
是常数。
在任何情况下还有其他方面:当达到负载因子时,unordered_map
可能需要重新散列(这需要时间并且可能是不可预测的(,而正常map
不涉及此类问题。此外,unordered_map
实现可以使用与存储桶的分离链接,因此如果碰巧发生许多冲突,则检索密钥的复杂性将变为恒定+线性。
我建议您使用一些具有类似于您需要的模式的数据对这两种结构进行基准测试,这将使您做出选择。
您无需为unordered_map
定义自己的hash<int>
,因为它已经实现。
相关文章:
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 将 int 数组转换为 std::vector<int*>
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 从 std::vector<无符号字符>切片中提取 int?
- std::cout输出int时出现编译错误
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- C++如何将 std::vector 转换为 const<int> std::vector<const int>?
- 为什么 std::d eclval<int>() = std::d eclval<int>() 无效?
- 将const int std ::数组的n元素复制到int矢量中.怎么做
- 如何从方法返回静态常量 int std::array?
- 尝试使用 const int std::array 时出错
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- C++ vector<pair<int,int>> std::all_of() 函数问题(重定向到头文件)
- 错误:从"int (*)(std::list<myclass*>, int, char**, char**)"到"int (*)(void*, int, char**, char**)"的
- Boost过载奇怪的行为.' int (int), int (std::string) '与' int (int)