Wer in C++ eigene Objekte definiert, möchte diese oft auch in Listen speichern und nach den jeweiligen Eigenschaften sortieren. Wir sehen uns in diesem Beitrag an, wie dies bewerkstelligt werden kann.
Im ersten Schritt binden wir die benötigten Module ein.
1 2 3 4 |
#include <iostream> //std::cout #include <string> //std::string #include <vector> //std::vector #include <algorithm> //std::sort |
Anschließend definieren wir die Struktur Mountain. Diese beinhaltet mehrere typische Eigenschaften von Bergen wie zum Beispiel die Höhe oder die geographische Position. Mit Hilfe des Konstruktors können beim Anlegen eines Mountain Objektes alle definierten Eigenschaften übergeben werden. Um die Objekte mit std::sort sortieren zu können implementieren wir zusätzlich für alle Attribute eine statische Funktion, die die jeweilige Eigenschaft des Objektes mit der gleichen Eigenschaft eines zweiten Objektes vergleichen kann.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
struct Mountain { std::string m_name; //Name des Berges double m_latitude; // geographische Breite double m_longitude;// geographische Länge int m_height; // Höhe int m_firstClimbed; // Erstbesteigung // Konstruktor Mountain(std::string name, double latitude, double longitude, int height, int firstClimbed) { m_name.assign(name); m_latitude = latitude; m_longitude = longitude; m_height = height; m_firstClimbed = firstClimbed; } // Berge nach Namen sortieren static bool sortByName (Mountain a, Mountain b) { return (a.m_name < b.m_name); } //Berge nach geographischer Breite sortieren static bool sortByLatitude (Mountain a, Mountain b) { return (a.m_latitude < b.m_latitude); } //Berge nach geographischer Länge sortieren static bool sortByLongitude (Mountain a, Mountain b) { return (a.m_longitude < b.m_longitude); } // Berge nach Höhe sortieren static bool sortByHeight (Mountain a, Mountain b) { return (a.m_height < b.m_height); } // Berge nach Jahr der Erstbesteigung sortieren static bool sortByFirstAscension (Mountain a, Mountain b) { return (a.m_firstClimbed < b.m_firstClimbed); } }; |
In unserer main() Funktion können wir nun mehrere Berge instanziieren und in einem vector anordnen. Anschließend verwenden wir std::sort um den vector nach den Attributen Name, geographische Breite und Höhe zu sortieren. In jedem Fall verwenden wir die entsprechende Sortierfunktion, die wir in der Struktur Mountain definiert haben. Im Fall der dritten Sortierung verwenden wir eine Sortierung in Absteigender Reihenfolge. Dies wird mit Hilfe der Parametern rbegin() und rend() erreich.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
int main() { // mehrere Berge instanzieren Mountain m1 {"Annapurna", 28.584823, 83.989921, 8091,1950}; Mountain m2 {"Shisha Pangma", 28.35, 85.7833, 8013, 1964}; Mountain m3 {"Gasherbrum IV", 35.762359, 76.615906, 7925, 1958}; Mountain m4 {"Distaghil Sar", 36.3333, 75.1833, 7885, 1960}; Mountain m5 {"Aconcagua", -32.653359, -70.011234, 6962, 1897}; // Liste mit Bergen initialisieren std::vector<Mountain> mountainList {m1, m2, m3, m4, m5}; // Berge nach Namen sortieren und ausgeben std::sort(mountainList.begin(), mountainList.end(), Mountain::sortByName); for (auto &i: mountainList) std::cout << i.m_name << ", "; std::cout << std::endl; // Berge nach geographischer Breite sortieren und ausgeben std::sort(mountainList.begin(), mountainList.end(), Mountain::sortByLatitude); for (auto &i: mountainList) std::cout << i.m_name << " " << i.m_latitude << ", "; std::cout << std::endl; // Berge nach Höhe Breite sortieren (absteigend) und ausgeben std::sort(mountainList.rbegin(), mountainList.rend(), Mountain::sortByHeight); for (auto &i : mountainList) std::cout << i.m_name << " " << i.m_height << ", "; std::cout << std::endl; return EXIT_SUCCESS; } |
Im Programm werden mehrere C++ 11 spezifische Methoden verwendet. Aus diesem Grund geben wir bei der Kompilierung das std Flag an:
$ g++ -std=c++11 sort.cpp -o sort
$ ./sort
Nach der Ausführung erhalten wir folgende Ausgabe:
1 2 3 |
Aconcagua, Annapurna, Distaghil Sar, Gasherbrum IV, Shisha Pangma, Aconcagua -32.6534, Shisha Pangma 28.35, Annapurna 28.5848, Gasherbrum IV 35.7624, Distaghil Sar 36.3333, Annapurna 8091, Shisha Pangma 8013, Gasherbrum IV 7925, Distaghil Sar 7885, Aconcagua 6962, |
Das komplette Beispiel herunterladen: sort.zip
Hinterlasse jetzt einen Kommentar