2015-05-24 12 views

Antwort

16

Die unordered_* Container benötigen eine Hash-Funktion. Standardmäßig verwenden sie std::hash, aber es gibt keine Spezialisierung std::hash für std::pair<T1,T2> in der Standardbibliothek zur Verfügung gestellt. Auf der anderen Seite, die bestellt Container verlassen sich auf std::less (standardmäßig) und std::pairhat haben operator< zur Verfügung gestellt. Deshalb funktioniert es einfach.

Um einen ungeordneten Container mit einer pair zu haben, müssen Sie selbst einen Hash-Funktor bereitstellen. Zum Beispiel:

struct SimpleHash { 
    size_t operator()(const std::pair<int, int>& p) const { 
     return p.first^p.second; 
    } 
}; 

std::unordered_set<std::pair<int, int>, SimpleHash> S; 
S.insert(std::make_pair(0, 1)); 
+0

würde S.emplace (... auch funktionieren, und wenn nicht, was würden Sie ändern – HeinrichStack

+1

@Barry p.first kann^p.second den gleichen Wert für verschiedene Paare wie p_a erhalten und p_b? – olivia

+1

@olivia Natürlich wird es Ihnen definitiv den gleichen Wert für '(a, b)' und '(b, a)' geben.Es ist nicht beabsichtigt, eine perfekte Hash-Funktion zu sein, nur ein einfaches Beispiel. – Barry

0

Sie müssen eine Hash-Funktion für ein Paar bereitstellen.