STL中的hash_map(unorder_map)原理及应用

/****************************************************************************************************
//hash_map是C++非标准STL,因为标准化的推进,hash_map属于非标准容器,未来将要用unordered_map替代之。
//建议我们使用unorder_map替代hash_map
//unorder_map原理与应用
//unorder_map基于哈希表实现
//哈希表优点:以空间换取时间
//基本原理:使用一个下标范围很大的数组来存储元素,通过设计哈希函数使每个元素的关键字Key
//			都与一个函数值(数组下标)对应,则用这个数组单元存储元素,这个数组单元可以
//			称之为“桶”。哈希表一大特点:直接寻址。

//不能保证Key与数组下标是一一对应的,即不同的元素可能分在同一个“桶”中。哈希表一大特点:
//解决冲突!

//unorder_map操作过程:首先分配一大片内存,形成很多“桶”。对Key进行映射到不同桶进行保存。
//插入过程:1.得到Key
//          2.通过hash函数得到hash值
//          3.得到桶号(一般都是hash值对桶总数求模)
//          4.存放key和value在桶内。
//取值过程:1.得到key值
//          2.通过hash函数得到hash值
//          3.得到桶号(一般都是hash值对桶总数求模)
//			4.比较桶内元素key值是否与待取key值相等,若不相等,则没有找到。
//			5.去除相等的记录的value。

//寻址————hash函数//
//                    //——>使用unorder_map需要指定的参数
//冲突————比较函数//

//STL中unorder_map的声明:
//template <class _key,class _Tp,chass _HashFcn=hash<_Key>,
//class _EqualKey=equal_to<_key>,
//class _Alloc=_STL_DEFAULT_ALLOCATOR(_Tp)>
//class unorder_map
//{
//      ....
//}
//必须指定参数 _key(键),_Tp(值)的类型。
//eg:unorder_map<int,string> mymap等同于unorder_map<int,string,hash<int>,equal_to<int>> mymap
//参数 hash<_Key>与equal_to<_key>详解:方便自己定义
//eg:hash<int>       struct hash<int>{
//							size_t operator()(int _x)const {return _x;}
//					 }---->函数对象

//STL提供的hash函数:
//struct hash<char*>
//struct hash<const char*>
//struct hash<char>
//struct hash<unsigned char>
//struct hash<signed char>
//struct hash<short>
//struct hash<unsigned short>
//struct hash<int>
//struct hash<unsigned int>
//struct hash<long>
//struct hash<unsigned long>

//eg:自定义string的hash函数       struct str_hash{
//										size_t operator()(const string & str)const
//										{
//												unsigned long _h=0;
//												for(size_t i=0;i<str.size();i++)
//													_h = 5 * _h + str[i];
//												return size_t(_h);
//										}
//								}
//自定义函数用法:unorder_map<string,string,str_hash>

//比较函数equal_to<Key>
//STL源码:
//
//template <class _Arg1, class _Arg2, class _Result>
//struct binary_function {
//	typedef _Arg1 first_argument_type;
//	typedef _Arg2 second_argument_type;
//	typedef _Result result_type;
//};
//template <class _Tp>
//struct equal_to : public binary_function<_Tp,_Tp,bool>
//{
//		bool operator()(const _Tp& _x,const _Tp& _y)const {return _x==_y;}
//}

//如果使用一个自定义的函数类型,如struct mystruct或者const char * 的字符串,
//自定义比较函数有两种方法:
//1.在对象里重载==操作符    struct mystruct{
//										int iID;
//										int len;
//										bool operator==(const mystruct &my) const{
//												return (iID==my.iID)&&(len==my.len);
//										}
//							}
//方法一用法:equal_to<mystruct>
//2.使用函数对象,自定义比较函数体
//struct compare_str{
//		  bool operator ()(const char *p1,const char *p2) const{
//					return strcmp(p1,p2)==0;
//		   }
//};
//方法二用法:unorder_map<const char*,string,hash<const char *>,compare_str>

//unorder_map函数
//1.unorder_map(size_type n):如果讲求效率,这个参数必须设置。n主要用来设置
//	unorder_map容器中hash桶的个数。桶的个数越多,hash函数发生冲突的概率就越小,
//	重新申请内存的概率就越小。n越大,效率越高,但是内存消耗越大。
//2.const_iterator find(const key_type &k)const:用于查找,输入为键值,返回
//	为迭代器。
//3.data_type & operator[](const key_type &k):返回key键值对应的value。
//4.insert。
//5.erase。

//比较map和unorder_map:
//构造函数。unorder_map需要hash函数,等于函数;map只需要比较函数(小于函数).
//存储结构。unorder_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。
*****************************************************************************************************/
//完整实例


#include <iostream>
#include <unordered_map>
#include <string>

using namespace std;

struct str_equal
{
	bool operator()(const char *A,const char *B) const {
		return strcmp(A, B) == 0;
	}
};
int main()
{
	typedef unordered_map<const char *, string, hash<const char *>, str_equal> my_map;
	my_map Charactor;
	Charactor["杨过"] = "黯然销魂掌";
	Charactor["小龙女"] = "玉女心经";
	Charactor["郭靖"] = "降龙十八掌";
	Charactor["黄蓉"] = "打狗棒法";

	cout << "遍历输出:" << endl;
	for (my_map::iterator itm = Charactor.begin(); itm != Charactor.end(); itm++)
		cout << "角色:" << itm->first << "   "<<"武学:" << itm->second << endl;
	
	Charactor.insert(make_pair("黄药师", "落英剑法"));
	cout << "插入后遍历输出:" << endl;
	for (my_map::iterator itm = Charactor.begin(); itm != Charactor.end(); itm++)
		cout << "角色:" << itm->first << "   " << "武学:" << itm->second << endl;
	
	cout << "郭靖的武学是:"<< Charactor.find("郭靖")->second<<endl;

	Charactor.erase("黄蓉");
	cout << "删除后遍历输出:" << endl;
	for (my_map::iterator itm = Charactor.begin(); itm != Charactor.end(); itm++)
		cout << "角色:" << itm->first << "   " << "武学:" << itm->second << endl;
	return 0;

}








 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值