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;
}