gpt4 book ai didi

c++ - unordered_map - 哈希函数无效

转载 作者:可可西里 更新时间:2023-11-01 16:26:34 25 4
gpt4 key购买 nike

为什么下面的散列函数(返回常量 0)似乎没有任何作用?

由于哈希函数返回常量,我期望输出所有值都是 3。但是,它似乎唯一地将 std::vector 值映射到唯一值,无论我哈希函数是常量。

#include <iostream>
#include <map>
#include <unordered_map>
#include <vector>


// Hash returning always zero.
class TVectorHash {
public:
std::size_t operator()(const std::vector<int> &p) const {
return 0;
}
};

int main ()
{
std::unordered_map<std::vector<int> ,int, TVectorHash> table;

std::vector<int> value1({0,1});
std::vector<int> value2({1,0});
std::vector<int> value3({1,1});

table[value1]=1;
table[value2]=2;
table[value3]=3;

std::cout << "\n1=" << table[value1];
std::cout << "\n2=" << table[value2];
std::cout << "\n3=" << table[value3];

return 0;
}

获得的输出:

1=1
2=2
3=3

预期输出:

1=3
2=3
3=3

关于哈希,我遗漏了什么?

最佳答案

您误解了散列函数的用途:它不是用来比较元素的。在内部,映射将元素组织到桶中,哈希函数用于确定元素所在的桶。元素的比较是通过另一个模板参数执行的,查看 unordered_map 模板的完整声明:

template<
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
class Allocator = std::allocator< std::pair<const Key, T> >
> class unordered_map;

散列器之后的下一个模板参数是关键比较器。要获得预期的行为,您必须执行以下操作:

class TVectorEquals {
public:
bool operator()(const std::vector<int>& lhs, const std::vector<int>& rhs) const {
return true;
}
};

std::unordered_map<std::vector<int> ,int, TVectorHash, TVectorEquals> table;

现在您的 map 将只有一个元素,所有结果都将是 3

关于c++ - unordered_map - 哈希函数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35791053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com