unordered_map用于实现哈希表。它存储键值对。对于每个键,都会计算一个哈希函数,并将值存储在该哈希条目中。预定义了标准数据类型(int,char, 字符串,..)的哈希函数。如何使用我们自己的数据类型实现哈希表?
unordered_map允许使用第三个参数来指定我们自己的哈希函数。
// Create an unordered_map with given KeyType,
// ValueType and hash function defined by
// MyHashType
unordered_map um;
MyHashFunction是必须包含运算符函数 ()的类或结构。
我们还必须在自己的用于处理冲突的类中实现运算符 == 。
下面是一个示例代码,其中Person类的对象用作键。我们定义自己的哈希函数,该函数使用名字和姓氏的总和作为哈希表中的键。请注意,此代码的目的是仅演示使用简单的代码,而长度总和作为哈希函数可能不是一个好主意。
// CPP program to demonstrate working of unordered_map
// for user defined data types.
#include
using namespace std;
// Objects of this class are used as key in hash
// table. This class must implement operator ==()
// to handle collisions.
struct Person {
string first, last; // First and last names
Person(string f, string l)
{
first = f;
last = l;
}
// Match both first and last names in case
// of collisions.
bool operator==(const Person& p) const
{
return first == p.first && last == p.last;
}
};
class MyHashFunction {
public:
// Use sum of lengths of first and last names
// as hash function.
size_t operator()(const Person& p) const
{
return p.first.length() + p.last.length();
}
};
// Driver code
int main()
{
unordered_map um;
Person p1("kartik", "kapoor");
Person p2("Ram", "Singh");
Person p3("Laxman", "Prasad");
um[p1] = 100;
um[p2] = 200;
um[p3] = 100;
for (auto e : um) {
cout << "[" << e.first.first << ", "
<< e.first.last
<< "] = > " << e.second << '\n';
}
return 0;
}
输出:
[Laxman, Prasad] = > 100
[kartik, kapoor] = > 100
[Ram, Singh] = > 200
另一个示例,其中预定义运算符使用预定义的哈希类来构成我们的整体哈希。
// CPP program to demonstrate working of unordered_map
// for user defined data types.
#include
using namespace std;
struct Person {
string first, last;
Person(string f, string l)
{
first = f;
last = l;
}
bool operator==(const Person& p) const
{
return first == p.first && last == p.last;
}
};
class MyHashFunction {
public:
// We use predfined hash functions of strings
// and define our hash function as XOR of the
// hash values.
size_t operator()(const Person& p) const
{
return (hash()(p.first)) ^
(hash()(p.last));
}
};
// Driver code
int main()
{
unordered_map um;
Person p1("kartik", "kapoor");
Person p2("Ram", "Singh");
Person p3("Laxman", "Prasad");
um[p1] = 100;
um[p2] = 200;
um[p3] = 100;
for (auto e : um) {
cout << "[" << e.first.first << ", "
<< e.first.last
<< "] = > " << e.second << '\n';
}
return 0;
}
输出:
[Laxman, Prasad] = > 100
[kartik, kapoor] = > 100
[Ram, Singh] = > 200
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。