Большинство людей использует символы (это :foo_bar
синтаксис). Они - вид уникальных непрозрачных значений. Символы не принадлежат никакому перечислимому типу стиля, таким образом, они не действительно точное представление типа перечисления C, но это в значительной степени столь хорошо, как это добирается.
Your problem is that hash
is only specialized for certain types. It can't magically make a hash function for any old type. You need to make your own hash function.
Вы используете его так же, как std :: map:
typedef hash_map<int,string> HMap;
HMap map;
map.insert(HMap::value_type(1,"two"));
for (HMap::iterator it = map.begin(); it != map.end(); ++it)
{
cout << (*it).first << " " << (*it).second << endl;
}
Есть некоторые различия с заголовочными файлами между windows и linux:
#ifdef WIN32
#include <hash_map>
#else
#include <ext/hash_map>
#endif
#ifndef WIN32
using __gnu_cxx::hash_map;
#endif
#ifdef WIN32
typedef hash_map< const K, V > HMap;
#else
typedef hash_map< const K, V, boost::hash<K> >;
#endif
Я считаю, что для linux hash_map требуется хеш-функция, чтобы иметь возможность хешировать ключ, вы можете использовать boost :: hash, как указано выше.
Вот ваш код, скомпилированный в Linux (см. Выше различия между Linux и Windows, я использую boost :: hash, потому что в Linux нет хеш-функции, она есть в Windows, я не уверен, что она перегружена для типа структуры ...):
#include <iostream>
//#include <hash_map>
#include <ext/hash_map>
#include <string>
#include <boost/functional/hash.hpp>
using namespace std;
//using namespace __gnu_cxx;
using __gnu_cxx::hash_map;
typedef pair<int,string> pis;
struct eqpis {
bool operator()(pis p1,pis p2) const {
if(p1==p2) return true;
return false;
}
};
int main() {
//hash_map<pis,int,hash<pis>,eqpis> map;
typedef hash_map<pis,int, boost::hash<pis>, eqpis > HMap;
HMap map;
map.insert(HMap::value_type(pis(10,"hello"), 11));
map.insert(HMap::value_type(pis(20,"hello"), 21));
map.insert(HMap::value_type(pis(30,"hello"), 31));
map.insert(HMap::value_type(pis(40,"hello"), 41));
for (HMap::iterator it = map.begin(); it != map.end(); ++it)
{
cout << (*it).first.first << ":" << (*it).first.second
<< " == " << (*it).second << endl;
}
}
Вывод:
40:hello == 41
20:hello == 21
10:hello == 11
30:hello == 31
Прежде всего, вам нужен std :: unordered_map
или unordered_set
. Требования состоят в том, что вашему классу нужен operator =
(или вам нужен класс EqualityCompare), и вам нужен класс хеширования, который имеет operator ()
, который принимает ваш тип ключа в качестве аргумента и возвращает size_t
.