无序映射不像对int, 字符串等那样包含一个对的哈希函数,因此,如果我们要对一个哈希对进行哈希处理,则必须显式为其提供可以对一个哈希对进行哈希处理的哈希函数。 unordered_map最多可以使用5个参数:
- 键:键值的类型
- 值:要针对键存储的值的类型
- 散列函数:用于散列给定密钥的函数。如果未提供,则使用默认哈希函数。
- PRED:这是用来使得没有两个密钥可以具有相同散列值的函数
- Alloc:用于定义映射的内存模型的对象
hash_function可以是任何东西,只要它可以哈希给定的键即可。
先决条件:如何创建用户定义类的unordered_map?
// CPP program to demonstrate implementation of
// unordered_map for a pair.
#include
using namespace std;
// A hash function used to hash a pair of any kind
struct hash_pair {
template
size_t operator()(const pair& p) const
{
auto hash1 = hash{}(p.first);
auto hash2 = hash{}(p.second);
return hash1 ^ hash2;
}
};
int main()
{
// Sending the hash function as a third argument
unordered_map, bool, hash_pair> um;
// Creating some pairs to be used as keys
pair p1(1000, 2000);
pair p2(2000, 3000);
pair p3(2005, 3005);
// Inserting values in the unordered_map.
um[p1] = true;
um[p2] = false;
um[p3] = true;
cout << "Contents of the unordered_map : \n";
for (auto p : um)
cout << "[" << (p.first).first << ", "
<< (p.first).second << "] ==> "
<< p.second << "\n";
return 0;
}
Contents of the unordered_map :
[1000, 2000] ==> 1
[2005, 3005] ==> 1
[2000, 3000] ==> 0
注意:我们可以为一对创建地图。签出一对地图。原因是,映射基于自平衡BST,并且不需要哈希函数。
练习题: Nikhil是一名旅行推销员,如今他正在新地区参观房屋以出售百科全书。新城市位于x * y(1 <= x <= 10 ^ 9,1 <= y <= 10 ^ 9)的网格中,每个交叉点处都有房屋。现在,他对记住已经拜访过的房屋不太满意,因此每当他进入房屋时,他都会告诉您房屋的坐标。您的工作是记住座标,并在一天结束时告诉他当天他所参观的所有房屋。
例子:
Input :
Enter the number of houses that he visited today :5
Enter the coordinate of HouseNo. 1 :1000 12985
Enter the coordinate of HouseNo. 2 :12548 25621
Enter the coordinate of HouseNo. 3 :14586 26481
Enter the coordinate of HouseNo. 4 :12 63
Enter the coordinate of HouseNo. 5 :14689 36945
Output :
Houses that he visited today:
12 63
14689 36945
14586 26481
1000 12985
12548 25621