Heim >Backend-Entwicklung >C++ >Wie sortiere ich eine std::map effizient nach Wert?

Wie sortiere ich eine std::map effizient nach Wert?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-26 10:33:14331Durchsuche

How to Efficiently Sort a std::map by Value?

So sortieren Sie std::map nach Wert

Das Sortieren einer std::map nach Wert statt nach Schlüssel kann eine Herausforderung sein. Eine gängige Lösung besteht darin, eine temporäre Multimap zu erstellen, die die Schlüssel-Wert-Paare umdreht und stattdessen sortiert. Es gibt jedoch alternative Techniken, die einen saubereren und vielseitigeren Ansatz bieten können.

Umdrehen der Paare

Der folgende Codeausschnitt zeigt, wie die Schlüssel-Wert-Paare umgedreht werden in einer std::map, um eine neue Multimap zu erstellen, sortiert nach Wert:

template<typename A, typename B>
std::pair<B,A> flip_pair(const std::pair<A,B> &amp;p)
{
    return std::pair<B,A>(p.second, p.first);
}

template<typename A, typename B>
std::multimap<B,A> flip_map(const std::map<A,B> &amp;src)
{
    std::multimap<B,A> dst;
    std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), 
                   flip_pair<A,B>);
    return dst;
}

Durch Aufruf von flip_map auf dem Original std::map können Sie eine nach Wert sortierte Multimap erhalten.

Generische assoziative Quelle

Dieser Ansatz kann verallgemeinert werden, um assoziative Container beliebiger Art mithilfe variadischer Vorlagen umzudrehen :

template<typename A, typename B, template<class,class,class...> class M, class... Args>
std::multimap<B,A> flip_map(const M<A,B,Args...> &amp;src)
{
    std::multimap<B,A> dst;
    std::transform(src.begin(), src.end(),
                   std::inserter(dst, dst.begin()),
                   flip_pair<A,B>);
    return dst;
}

Diese generische Überladung funktioniert mit jedem assoziativen Container, der den std::transform-Algorithmus unterstützt, einschließlich std::map und std::unordered_map.

Das obige ist der detaillierte Inhalt vonWie sortiere ich eine std::map effizient nach Wert?. 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