无序容器unorder_map使用自定义类型

      unorder_map使用hash函数和关键字类型的==运算符来组织元素,使用hash函数将元素映射到桶中,为了访问一个元素,容器首先计算元素的哈希值,他指出应该搜索那个桶。默认情况下,无序容器使用关键字类型的==运算符来比较元素,它还使用一个hash<key_tpyr>类型的对象来生成每个元素的哈希值。标准库位内置类型提供了hash模板。包括string类型。但是我们不能直接定义关键类型为自定义类型的无序容器。因此我们需要自己定义该类型一个哈希函数。而且需要自己定义相等函数。

hash函数

struct HashFunc
{
	std::size_t operator()(const Node &key) const
	{
		using std::size_t;
		using std::hash;

		return ((hash<int>()(key.first)
			^ (hash<int>()(key.second) << 1)) >> 1)
			^ (hash<int>()(key.third) << 1);
	}
};

相等函数
struct EqualKey
{
	bool operator () (const Node &lhs, const Node &rhs) const
	{
		return lhs.first == rhs.first
			&& lhs.second == rhs.second
			&& lhs.third == rhs.third;
	}
};

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;

struct Node
{
	int first;
	int second;
	int third;
	Node(int i, int j, int k) :first(i), second(j), third(k)
	{}
	Node(){}
	bool operator==(const Node&rhs) const
	{
		return first == rhs.first && second == rhs.second
			&& third == rhs.third;
	}
};

struct HashFunc
{
	std::size_t operator()(const Node &key) const
	{
		using std::size_t;
		using std::hash;

		return ((hash<int>()(key.first)
			^ (hash<int>()(key.second) << 1)) >> 1)
			^ (hash<int>()(key.third) << 1);
	}
};

struct EqualKey
{
	bool operator () (const Node &lhs, const Node &rhs) const
	{
		return lhs.first == rhs.first
			&& lhs.second == rhs.second
			&& lhs.third == rhs.third;
	}
};

int main() 
{
	unordered_map<Node, int, HashFunc,EqualKey> h;
	Node key1(1, 2, 3);
	h[key1] = 1;
	Node key2(3, 4, 45);

	cout << h[key1] << endl;
	cout << h[key2] << endl;
	system("pause");
	return 0;
}

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;


struct HashFunc
{
	std::size_t operator()(const vector<int> &key) const
	{
		using std::size_t;
		using std::hash;
		size_t res = hash<int>()(key[0]);
		for (int i = 1; i < key.size(); ++i)
		{
			res ^= (hash<int>()(key[i]) << (i % 2));
		}
		return res;
	}
};

struct EqualKey
{
	bool operator () (const vector<int> &lhs, const vector<int> &rhs) const
	{
		for (int i = 0; i < lhs.size(); ++i)
		{
			if (lhs[i] != rhs[i])
				return false;
		}
		return true;
	}
};

int main()
{
	unordered_map<vector<int>, int, HashFunc, EqualKey> h;
	vector<int> key1 = { 1, 2, 3 };
	vector<int> key2 = { 2, 3, 4 };
	h[key1] = 3;
	cout << h[key1] << endl;
	cout << h[key2] << endl;
	system("pause");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/yang20141109/article/details/62449247