Как использовать unordered_set в STL?

Большинство людей использует символы (это :foo_bar синтаксис). Они - вид уникальных непрозрачных значений. Символы не принадлежат никакому перечислимому типу стиля, таким образом, они не действительно точное представление типа перечисления C, но это в значительной степени столь хорошо, как это добирается.

5
задан ddacot 4 February 2012 в 12:15
поделиться

3 ответа

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.

8
ответ дан 18 December 2019 в 09:50
поделиться

Вы используете его так же, как 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
2
ответ дан 18 December 2019 в 09:50
поделиться

Прежде всего, вам нужен std :: unordered_map или unordered_set . Требования состоят в том, что вашему классу нужен operator = (или вам нужен класс EqualityCompare), и вам нужен класс хеширования, который имеет operator () , который принимает ваш тип ключа в качестве аргумента и возвращает size_t .

6
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: