2016-06-29 7 views
1

Ich habe eine STL-Map mit String-Schlüsseln und int-Werten. Ich muss die Elemente in eine neue Map mit int-Schlüsseln und String-Werten einfügen, so dass die Schlüssel vom niedrigsten zum größten sortiert werden.Sortieren einer STL-Map vom niedrigsten zum höchsten Wert

Zum Beispiel habe ich eine Karte mit diesen Werten (Schlüssel, Wert):

"A", 5 
"B", 2 
"C", 8 
"D", 4 

ich sie möchte dann so angeordnet sein, dass sie wie folgt aussehen (Schlüssel, Wert):

2, "B" 
4, "D" 
5, "A" 
8, "C" 

Wo der Wert aus der ursprünglichen Karte wird der Schlüssel, und der Schlüssel wird der Wert.

Ich weiß, dass ich die Werte von der ursprünglichen Karte zu einer neuen Karte hinzufügen muss, aber ich bin nicht sicher, wie ich sie in einer Weise hinzufügen würde, dass sie vom niedrigsten zum größten sortiert werden.

Antwort

4

Etwas in dieser Richtung vielleicht:

std::map<std::string, int> old_map = ...; // initialized somehow 
std::map<int, std::string> new_map; 

std::transform(old_map.begin(), old_map.end(), 
    std::inserter(new_map, new_map.end()), 
    [](decltype(old_map)::iterator it) { 
    return std::make_pair(it->second, it->first); 
    } 
); 
1

Für jedes Paar in der ursprünglichen Karte, das Paar umkehren und in die andere Karte einfügen. Die Sortierung erfolgt automatisch, da std::map nach Schlüssel sortiert ist.

Auch, wenn Sie mit den gleichen Daten in der ursprünglichen Karte mehrere Schlüssel haben könnte (zum Beispiel beide "A" und "E" haben die Daten 5), dann müssen Sie std::multimap stattdessen werden.

+0

Also std :: map sortiert automatisch vom niedrigsten zum größten, wenn der Schlüssel ein int ist? – Darren

+0

@Darren Ja, weil das Standard-Sortierverhalten 'std :: less <>' – user2296177

+0

ist Okay danke, das wird dann gut funktionieren. – Darren

1

Für std:map ist es, um mit Schlüssel Standard.

Internally, the elements in a map are always sorted by its key following a specific strict weak ordering criterion indicated by its internal comparison object (of type Compare). 

Lesen Sie bitte dem Link: http://www.cplusplus.com/reference/map/map/

#include <iostream> 
#include <string> 
#include <iterator> 
#include <algorithm> 
#include <map> 
using namespace std; 

int main() { 
    map<string, int> myMap; 
    myMap["D"] = 4; 
    myMap["C"] = 8; 
    myMap["B"] = 2; 
    myMap["A"] = 5; 
    cout<<"before:"<<endl; 
    for_each(myMap.begin(), myMap.end(), [](auto& element){cout<<element.first<<" "<<element.second<<endl;}); 

    map<int, string> otherMap; 
    cout<<"after:"<<endl; 
    for_each(myMap.begin(), myMap.end(), [&otherMap](auto& element){otherMap[element.second] = element.first;}); 
    for_each(otherMap.begin(), otherMap.end(), [](auto& element){cout<<element.first<<" "<<element.second<<endl;}); 
    return 0; 
} 

Hier ist der Code exmaple: der Ausgang ist:

before: 
A 5 
B 2 
C 8 
D 4 
after: 
2 B 
4 D 
5 A 
8 C 

So sortieren Sie nicht, es selbst.

Verwandte Themen