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::pair
hat 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));
würde S.emplace (... auch funktionieren, und wenn nicht, was würden Sie ändern – HeinrichStack
@Barry p.first kann^p.second den gleichen Wert für verschiedene Paare wie p_a erhalten und p_b? – olivia
@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