Heim >Backend-Entwicklung >C++ >Wie kann ich eine „std::map' effizient nach Wert in C sortieren?

Wie kann ich eine „std::map' effizient nach Wert in C sortieren?

DDD
DDDOriginal
2024-12-02 09:29:10142Durchsuche

How Can I Efficiently Sort a `std::map` by Value in C  ?

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!

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