Heim >Backend-Entwicklung >C++ >Wie kann ich eine „std::map' effizient nach Wert in C sortieren?
Std::map nach Wert sortieren
Das Sortieren einer std::map nach Wert und nicht nach Schlüssel ist eine häufige Anforderung in verschiedene Programmierszenarien. Dieser Artikel bietet eine elegante Lösung für dieses Problem, indem die Schlüssel- und Wertpaare in der Karte mithilfe benutzerdefinierter Vorlagenfunktionen umgedreht werden.
Benutzerdefinierte Vorlagenfunktionen zum Umdrehen von Paaren und Karten
Die bereitgestellte Lösung umfasst zwei benutzerdefinierte Vorlagenfunktionen: flip_pair() und flip_map(). Die Funktion flip_pair() nimmt ein Wertepaar und dreht es um, was zu einem neuen Paar mit den ausgetauschten Werten führt.
template<typename A, typename B> std::pair<B,A> flip_pair(const std::pair<A,B> &p) { return std::pair<B,A>(p.second, p.first); }
Die Funktion flip_map() verwendet die Funktion flip_pair(), um alle wichtigen Werte umzudrehen. Wertepaare in der Quellkarte und geben eine neue Multimap mit den gespiegelten Paaren zurück.
template<typename A, typename B> std::multimap<B,A> flip_map(const std::map<A,B> &src) { std::multimap<B,A> dst; std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), flip_pair<A,B>); return dst; }
Beispiel Verwendung
Um eine std::map nach Wert zu sortieren, kann man die Funktion flip_map() verwenden, um eine neue Multimap mit den gespiegelten Paaren zu erstellen. Diese Multimap wird nach den früheren Werten der Quellkarte sortiert.
std::map<int, double> src; ... std::multimap<double, int> dst = flip_map(src); // dst is now sorted by what used to be the value in src!
Generische assoziative Quelle für C 11 und höher
Für alternative assoziative Container zu Standard: :map, wie z. B. std::unordered_map, kann eine allgemeinere Funktion verwendet werden, um sowohl std::map als auch zu verarbeiten std::unordered_map-Quellen.
// flips an associative container of A,B pairs to B,A pairs template<typename A, typename B, template<class,class,class...> class M, class... Args> std::multimap<B,A> flip_map(const M<A,B,Args...>& src) { std::multimap<B,A> dst; std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), flip_pair<A,B>); return dst; }
Diese Funktion kann mit jedem assoziativen Container verwendet werden, der die erforderlichen Vorlagenparameter unterstützt, wie z. B. std::map, std::unordered_map und mehr.
Das obige ist der detaillierte Inhalt vonWie kann ich eine „std::map' effizient nach Wert in C sortieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!