__gnu_cxx хэш-карта с ключами типа std :: pair <std :: string, unsigned int>? - PullRequest
2 голосов
/ 25 октября 2010

Поскольку std::pair<std::string, unsigned int> не определено для хеш-карты __gnu_cxx, как мне создать хеш-карту __gnu_cxx с ключами типа std::pair<std::string, unsigned int> и значениями типа std::pair<int, CBTNODE>?(CBTNODE равно typedef как typedef int CBTNODE)

Если это возможно, я бы действительно хотел заменить std::pair<std::string, unsigned int> на typedef-ed INDEX (typedef std::pair<std::string, unsigned int> INDEX)

Любая помощь будет высоко ценится!

Z.Zen

1 Ответ

3 голосов
/ 25 октября 2010

Это похоже на компиляцию и вывод правильного ответа (1):

#include <hash_map>
#include <utility>
#include <string>
#include <iostream>

typedef int CBTNODE;
typedef std::pair<std::string, unsigned int> INDEX;
typedef std::pair<int, CBTNODE> Element;

struct pairhash{
    size_t operator()(const INDEX &p) const {
        return
          __gnu_cxx::hash<const char*>()(p.first.c_str()) ^
          __gnu_cxx::hash<unsigned int>()(p.second);
    }
};

int main() {
    __gnu_cxx::hash_map<INDEX, Element, pairhash> x;
    INDEX foo("hi", 0);
    Element bar(1, 2);
    x[foo] = bar;
    std::cout << x[foo].first << "\n";
}

Что было немного утомительно. Проблема в том, что __gnu_cxx::hash не предоставляет специализацию для pair, или, в этом отношении, для string. Я полагаю, что здесь следует API SGI: http://www.sgi.com/tech/stl/hash.html. Таким образом, pairhash (или что-то в этом роде) необходимо для предоставления недостающей хэш-функции.

Я не виню вас за то, что вы этого не заметили, поскольку вызванная этим ошибка компилятора была немного неочевидной. И долго.

Если вы можете, вам, вероятно, лучше использовать boost::unordered_map. SGI hash_map - это старый API, никогда не принятый в стандарт, который должен быть заменен на C ++ 0x и т. Д. И т. Д.

...