Heim >Backend-Entwicklung >C++ >Warum kann ich „std::pair' nicht als Schlüssel in einer „std::unordered_map' verwenden und wie kann ich das beheben?

Warum kann ich „std::pair' nicht als Schlüssel in einer „std::unordered_map' verwenden und wie kann ich das beheben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-07 02:57:12854Durchsuche

Why Can't I Use `std::pair` as the Key in an `std::unordered_map` and How Do I Fix It?

Warum kann ich keine unordered_map mit einem Paar als Schlüssel kompilieren?

Das Problem hier ist das Fehlen einer geeigneten Hash-Funktion für den Schlüsseltyp. Um dieses Problem zu beheben, stellen Sie eine benutzerdefinierte Hash-Funktion für den Paarschlüssel bereit. Hier ist ein Beispiel:

#include <unordered_map>
#include <functional>
#include <string>
#include <utility>

struct pair_hash {
    template <class T1, class T2>
    std::size_t operator() (const std::pair<T1,T2>& p) const {
        auto h1 = std::hash<T1>{}(p.first);
        auto h2 = std::hash<T2>{}(p.second);

        return h1 ^ h2;  // Simple example, for better results use boost.hash_combine
    }
};

using Vote = std::pair<std::string, std::string>;
using Unordered_map = std::unordered_map<Vote, int, pair_hash>;

Mit dieser benutzerdefinierten Hash-Funktion können Sie jetzt eine unordered_map erstellen. ohne Kompilierungsfehler. Beachten Sie, dass die hier bereitgestellte Hash-Funktion zu Demonstrationszwecken vereinfacht ist. Erwägen Sie für reale Szenarien den Einsatz von Techniken wie boost.hash_combine von Boost, um die Qualität Ihrer Hash-Funktion zu verbessern.

Das obige ist der detaillierte Inhalt vonWarum kann ich „std::pair' nicht als Schlüssel in einer „std::unordered_map' verwenden und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn