hash_map 总结

GCC 编译器 使用 hash_map:

 

#include <ext/hash_map>
 
using namespace __gnu_cxx;
 
struct compare_str
{
    bool operator()(const char* p1, const char*p2) const
    {
        return strcmp(p1, p2) == 0;
    }
};
 
int main(int argc, char* argv[])
{
    hash_map<const char*, int, hash<const char*>, compare_str> StrIntMap;
    StrIntMap["a"] = 111;
    StrIntMap["b"] = 222;
    return 0;
}

VC 编译器使用 hash_map:

#include <hash_map> 
using namespace std; 
using namespace stdext; 

struct CharLess : public binary_function<const char*, const char*, bool> 
{ 
public: 
    result_type operator()(const first_argument_type& _Left, const second_argument_type& _Right) const 
    { 
        return(stricmp(_Left, _Right) < 0 ? true : false); 
    } 
}; 

hash_map<const char*, int, hash_compare<const char*, CharLess> > CharHash; 
CharHash["a"] = 123; 
CharHash["b"] = 456; 
char szInput[64] = ""; 
scanf("%s", szInput); 

若是int类型,可以不设置比较器,但对于指针类型则不行,例如char*。例如,下面的代码就会去比较"a"和"b"这两个常量的指针大小,这个时候就需要上面的比较器了。


以上内容转自 http://blog.chinaunix.net/uid-24352482-id-3440401.html


下面是 STL 源码解析书中的一个例子,我把它改到 GCC:

#include <iostream>
#include <ext/hash_map>
#include <cstring>
using namespace std;
using namespace __gnu_cxx;


struct eqstr
{
	bool operator()(const char* s1, const char* s2)const{
		return strcmp(s1, s2)==0;
	};
};

int main()
{
	hash_map<const char*, int, hash<const char*>, eqstr> days;
	
	days["january"] = 31;
	days["february"] = 28;
	days["march"] = 31;
	days["april"] = 30;
	days["may"] = 31;
	days["june"] = 30;
	days["july"] = 31;
	days["august"] = 31;
	days["september"] = 30;
	days["october"] = 31;
	days["novemver"] = 30;
	days["december"] = 31;

	cout << "september -> " << days["september"] << endl;
	cout << "june      -> " << days["june"] << endl;
	cout << "february  -> " << days["february"] << endl;
	cout << "december  -> " << days["december"] << endl;
	
	hash_map<const char*, int, hash<const char*>, eqstr>::iterator
		hmiter1, hmiter2;
	
	hmiter1 = days.begin();
	hmiter2 = days.end();
	cout << endl << "TRAVERSE:" << endl;
	for(; hmiter1 != hmiter2; ++hmiter1)
		cout << hmiter1->first << "," << hmiter1->second << endl;
		
	return 0;
}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值