hash_map的用法续

如果要在hash_map中把自已定义的类作为key的话要怎么做?这种情况下需要定义计算自定义的hash函数和比较自定义类的比较函数

#include <stdio.h>
#include <string>
#include <hash_map>
using namespace std;

class A
{
public:
	A(int a, int b) : m_a(a), m_b(b) {}
	A(const A& a)
	{
		printf("Copy construction\n");
		m_a = a.m_a;
		m_b = a.m_b;
	}
	~A() {}

public:
	int HashVal() const
	{
		return m_a * m_b;
	}

	int GetV() const
	{
		return m_a + m_b;
	}

private:
	int m_a;
	int m_b;
};

struct A_Hash_Compare : public hash_compare<const A>
{
	size_t operator()(const A& a)
	{
		printf("count hash val\n");
		return a.HashVal();
	}

	bool operator()(const A& a, const A& b)
	{
		printf("compare\n");
		return a.GetV() < b.GetV();
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	hash_map<A, int, A_Hash_Compare> A_hm;
	A a = A(1, 2);
	A b = A(1, 3);
	A_hm[a] = 123;
	printf("\n");
	A_hm.insert(pair<A, int>(b, 1));
	printf("\n");
	printf("%d\n", A_hm[a]);
	getchar();
	return 0;
}

运行结果为:

count hash val
Copy construction
Copy construction
count hash val

Copy construction
Copy construction
count hash val

count hash val
compare
compare
123

插入和初始化

#include <stdio.h>
#include <hash_map>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	hash_map<int, int> i_hm;
	//首次插入元素
	pair<hash_map<int, int>::iterator, bool> ret = i_hm.insert(pair<int, int>(1, 1));
	printf("ret.second: %d, ret.first->first: %d, ret.first->second: %d\n", ret.second, ret.first->first, ret.first->second);
	//插入同样的元素
	ret = i_hm.insert(pair<int, int>(1, 1));
	printf("ret.second: %d, ret.first->first: %d, ret.first->second: %d\n", ret.second, ret.first->first, ret.first->second);
	//首次插入元素
	hash_map<int, int>:: iterator iter = i_hm.insert(i_hm.begin(), pair<int, int>(2, 2));
	printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	//插入同样的元素
	iter = i_hm.insert(i_hm.begin(), pair<int, int>(2, 2));
	printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	//插入initalizer_list,返回值为void,需要c++ 11支持
	i_hm.insert({ pair<int, int>(3, 3), pair<int, int>(4, 6), pair<int, int>(5, 10) });

	//输出元素
	hash_map<int, int>::iterator i_iter = i_hm.begin();
	for (; i_iter != i_hm.end(); ++i_iter)
		printf("i_hm[%d] = %d\n", i_iter->first, i_iter->second);
	printf("\n");

	hash_map<int, int> j_hm;
	//返回值为void
	j_hm.insert(i_hm.begin(), i_hm.end());
	//输出元素
	hash_map<int, int>::iterator j_iter = j_hm.begin();
	for (; j_iter != j_hm.end(); ++j_iter)
		printf("j_hm[%d] = %d\n", j_iter->first, j_iter->second);
	printf("\n");

	//初始化
	hash_map<int, int> k_hm(j_hm);
	//输出元素
	hash_map<int, int>::iterator k_iter = k_hm.begin();
	for (; k_iter != k_hm.end(); ++k_iter)
		printf("k_hm[%d] = %d\n", k_iter->first, k_iter->second);
	printf("\n");

	hash_map<int, int> m_hm(j_hm.begin(), j_hm.end());
	//输出元素
	hash_map<int, int>::iterator m_iter = m_hm.begin();
	for (; m_iter != m_hm.end(); ++m_iter)
		printf("m_hm[%d] = %d\n", m_iter->first, m_iter->second);
	printf("\n");

	hash_map<int, int> n_hm = j_hm;
	//输出元素
	hash_map<int, int>::iterator n_iter = n_hm.begin();
	for (; n_iter != n_hm.end(); ++n_iter)
		printf("n_hm[%d] = %d\n", n_iter->first, n_iter->second);
	printf("\n");

运行结果为:

ret.second: 1, ret.first->first: 1, ret.first->second: 1
ret.second: 0, ret.first->first: 1, ret.first->second: 1
iter->first: 2, iter->second: 2
iter->first: 2, iter->second: 2
i_hm[1] = 1
i_hm[2] = 2
i_hm[3] = 3
i_hm[4] = 6
i_hm[5] = 10

j_hm[1] = 1
j_hm[2] = 2
j_hm[3] = 3
j_hm[4] = 6
j_hm[5] = 10

k_hm[1] = 1
k_hm[2] = 2
k_hm[3] = 3
k_hm[4] = 6
k_hm[5] = 10

m_hm[1] = 1
m_hm[2] = 2
m_hm[3] = 3
m_hm[4] = 6
m_hm[5] = 10

n_hm[1] = 1
n_hm[2] = 2
n_hm[3] = 3
n_hm[4] = 6
n_hm[5] = 10


查找、删除、交换、清空

#include <stdio.h>
#include <hash_map>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	hash_map<int, int> i_hm;
	//首次插入元素
	pair<hash_map<int, int>::iterator, bool> ret = i_hm.insert(pair<int, int>(1, 1));
	printf("ret.second: %d, ret.first->first: %d, ret.first->second: %d\n", ret.second, ret.first->first, ret.first->second);
	//插入同样的元素
	ret = i_hm.insert(pair<int, int>(1, 1));
	printf("ret.second: %d, ret.first->first: %d, ret.first->second: %d\n", ret.second, ret.first->first, ret.first->second);
	//首次插入元素
	hash_map<int, int>:: iterator iter = i_hm.insert(i_hm.begin(), pair<int, int>(2, 2));
	printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	//插入同样的元素
	iter = i_hm.insert(i_hm.begin(), pair<int, int>(2, 2));
	printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	//插入initalizer_list,返回值为void,需要c++ 11支持
	i_hm.insert({ pair<int, int>(3, 3), pair<int, int>(4, 6), pair<int, int>(5, 10) });
	printf("\n");
	
	//查找元素
	iter = i_hm.find(1);
	printf("查找key:1\n");
	if (iter != i_hm.end())
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	else
		printf("iter == end\n");
	printf("查找key:100\n");
	iter = i_hm.find(100);
	if (iter != i_hm.end())
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	else
		printf("iter == end\n");
	printf("\n");

	//返回删除的元素个数
	size_t num = i_hm.erase(1);
	printf("num: %d\n", num);
	num = i_hm.erase(1);
	printf("num: %d\n", num);
	//返回的迭代器指向下一个元素
	iter = i_hm.erase(i_hm.begin());
	if (iter != i_hm.end())
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	//返回的迭代器指向下一个元素
	iter = i_hm.erase(i_hm.begin(), i_hm.end());
	if (iter != i_hm.end())
		printf("iter->first: %d, iter->second: %d\n", iter->first, iter->second);
	else
		printf("iter == end\n");
	printf("\n");

	//swap函数
	i_hm.insert({ pair<int, int>(3, 3), pair<int, int>(4, 6), pair<int, int>(5, 10) });
	hash_map<int, int> j_hm({ pair<int, int>(11, 3), pair<int, int>(12, 6)});
	j_hm.swap(i_hm);
	iter = i_hm.begin();
	for (; iter != i_hm.end(); ++iter)
		printf("i_hm[%d] = %d\n", iter->first, iter->second);
	printf("\n");

	iter = j_hm.begin();
	for (; iter != j_hm.end(); ++iter)
		printf("j_hm[%d] = %d\n", iter->first, iter->second);
	printf("\n");

	//清空
	i_hm.clear();
	j_hm.clear();
	iter = i_hm.begin();
	for (; iter != i_hm.end(); ++iter)
		printf("i_hm[%d] = %d\n", iter->first, iter->second);
	printf("\n");

	iter = j_hm.begin();
	for (; iter != j_hm.end(); ++iter)
		printf("j_hm[%d] = %d\n", iter->first, iter->second);
	printf("\n");
	getchar();
	return 0;
}

运行结果为:

ret.second: 1, ret.first->first: 1, ret.first->second: 1
ret.second: 0, ret.first->first: 1, ret.first->second: 1
iter->first: 2, iter->second: 2
iter->first: 2, iter->second: 2

查找key:1
iter->first: 1, iter->second: 1
查找key:100
iter == end

num: 1
num: 0
iter->first: 3, iter->second: 3
iter == end

i_hm[11] = 3
i_hm[12] = 6

j_hm[3] = 3
j_hm[4] = 6
j_hm[5] = 10


你可能感兴趣的:(hash_map的用法续)