假设您有两个哈希H(A)并且H(B)您想要将它们组合在一起.我已经读到了将两个哈希值组合在一起的好方法XOR,例如XOR( H(A), H(B) ).
我发现的最佳解释在这里简要介绍了这些哈希函数指南:
对具有大致随机分布的两个数字进行异或,导致另一个数字仍具有大致随机分布*,但现在取决于这两个值.
...
*在两个数字相结合的每个比特,一个输出0,如果两个比特相等,否则为1.换句话说,在组合的50%,1将输出.因此,如果两个输入位各有大约50-50的机会为0或1,那么输出位也是如此.
你能解释为什么XOR应该是组合散列函数(而不是OR或AND等)的默认操作的直觉和/或数学吗?
首先,你可能知道const可以用来制作一个对象的数据或一个不可修改的指针或两者兼而有之.
const Object* obj; // can't change data
Object* const obj; // can't change pointer
const Object* const obj; // can't change data or pointer
Run Code Online (Sandbox Code Playgroud)
但是您也可以使用以下语法:
Object const *obj; // same as const Object* obj;
Run Code Online (Sandbox Code Playgroud)
唯一重要的是你把const关键字放在星号的哪一边.我个人更喜欢把const上式的左边指定它的数据是不可修改的,因为我觉得它读取我的左到右的心态更好,但其语法是先?
更重要的是,为什么有两种正确的const数据指定方式,如果有的话,你会更喜欢或需要哪种方式?
编辑:
所以听起来这是一个武断的决定,因为编译器应该如何解释事物的标准早在我出生之前起草了.因为const应用于关键字左侧的内容(默认情况下?)我猜他们认为添加"快捷方式"以应用关键字并以其他方式输入限定符至少直到声明更改为止时没有任何损害解析*或&...
这是C的情况,然后我假设?
我想使用STL中的一对作为地图的关键.
#include <iostream>
#include <map>
using namespace std;
int main() {
typedef pair<char*, int> Key;
typedef map< Key , char*> Mapa;
Key p1 ("Apple", 45);
Key p2 ("Berry", 20);
Mapa mapa;
mapa.insert(p1, "Manzana");
mapa.insert(p2, "Arandano");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是编译器会抛出一堆不可读的信息,而且我对C和C++很新.
如何在地图中使用一对作为键?一般而言,我如何使用任何类型的结构(对象,结构等)作为地图中的键?
谢谢!
#include <bits/stdc++.h>
std::unordered_map<std::pair<int,int>, int> mp;
int main()
{
mp[make_pair(1, 2)]++;
}
Run Code Online (Sandbox Code Playgroud)
使用时[] operator,我得到了这个
error: no match for ‘operator[]’ (operand types are ‘std::unordered_map<std::pair<int, int>, int>’ and ‘std::pair<int, int>’)
Run Code Online (Sandbox Code Playgroud)
但是,当用 做同样的事情时std::map,不会发生错误。为什么?
我怎样才能让它工作std::unorderd_m?
在考虑重复之前,请理解我的问题的基础.
为什么C++ std::map接受a std::pair作为键类型,但是a std::unordered_map不接受?
第一个案例完美编译:
#include <map>
#include <utility>
using namespace std;
typedef pair<int,int> int_pair;
int main()
{
map<int_pair,int> m;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第二种情况给出了大量的编译错误.从这个SO问题和这个SO问题中可以清楚地看出,必须创建自定义散列函数和等价运算符.
#include <unordered_map>
#include <utility>
using namespace std;
typedef pair<int,int> int_pair;
int main()
{
unordered_map<int_pair,int> m;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题不是如何编写哈希函数std::unordered_map.问题是,为什么在不需要的时候std::map需要一个人?
我知道std::map是一个二进制搜索树(BST),但是在非基本类型(int_pair)的键之间进行比较的确切程度如何呢?