2016-07-11 11 views
0

Ich brauche Vorschlag, STL-Container auf die bestmögliche Weise zu verwenden, um 3 Sätze von Daten zu sortieren 1. Eine ID (Ganzzahl) 2. Erster Wert (String) 3 . Zweiter Wert (String)Sortieren ID und 2 Sätze von Werten mit STL-Containern

ein Beispiel für die Datenstruktur ist wie folgt:

enter image description here

I Karte verwenden möchten, wie es zum Zeitpunkt des Einsatzes und keine Notwendigkeit, sortiert ist eine Sortierung auszuführen Algorithmus getrennt. Da sich die ID wiederholen kann, muss es eine Multimap sein, und jedes Datenelement einer Spalte ist miteinander verknüpft, so dass sich die Zeilen ändern, um dieselben Werte zu behalten, die an eine ID angehängt sind.

Sortieren der ID und Wert ist in Ordnung, aber wie sortiere ich 2 Werte als multimap kann nur einen Wert zu nehmen. Aus meiner Sicht wird es Multimap einer Multimap oder einer Struktur der Datenstruktur und dann STL-Container sein. Aber ich möchte es so einfach wie möglich machen. Ich brauche einen Vorschlag, wie dies erreicht werden kann.

Danke!

+0

Schlägt der Kommentar "zum Zeitpunkt der Eingabe sortiert" vor, dass Sie das einmal einrichten, dann einfach darüber laufen - keine weiteren Einfügungen oder Löschungen? – doctorlove

+0

Nicht genau! Ich möchte nach jedem Vorgang automatisch sortieren, löschen und nicht sortieren. – dDebug

Antwort

0

Eine Map oder ein Set ist nur dann sinnvoll, wenn Sie viele Operationen zum Einfügen/Löschen ausführen. Wenn die Datenstruktur statisch ist, ist es viel effektiver, einen Vektor zu speichern und einmal zu sortieren. Das heißt, wenn ich deine Frage richtig verstehe, denke ich, dass du keine Karte brauchst, sondern ein Multiset.

typedef pair<int, pair<string, string>> myDataType; 

set<myDataType> mySet; 

hier wird die operator < des Paar der Bestellung kümmern.

Wenn Sie nicht wollen, auf die ID als elem.first und auf die Saiten wie elem.second.first und elem.second.second beziehen, dann können Sie eine Struktur und Überlastung operator < für sie verwenden.

struct myType 
{ 
    int id; 
    string s1; 
    string s2; 
}; 
bool operator < (const myType& t1, const myType& t2) 
{ 
    return make_tuple(t1.id, t1.s1, t1.s2) < make_tuple(t2.id, t2.s1, t2.s2); 
} 
0

Sie könnten einfach eine std::set<std::tuple<int, std::string, std::string>> verwenden. Tupel werden lexikographisch verglichen, so dass Sie den gewünschten Effekt erhalten.

Live Demo

0

Elemente in einem multimap werden von dem Key sortiert. Sie können Multimap nicht sortieren. Was Sie tun können, ist, Vektor von pairs<Key, Map<Key>::Interator> mit Elementen zu erstellen, die einige logische Bedingung erfüllen und Vektor sortieren.

+0

Überprüfen Sie Ihre Formatierung. Sehen Sie sich die Postvorschau an, bevor Sie auf "Senden" klicken, und überprüfen Sie die Ergebnisse, nachdem Ihre Antwort gepostet wurde. –