C++ Strukturen in Vekotern sortieren



  • Folgendes bin neu absoult in der Programmierung.
    Lerne grade und stecke an meinem Telefonbuch fest, ich muss meine Struktur Kontakte, die die Werte nummer, adresse name etc. enthält sortieren.
    Sie werden alles durch Eingabe befüllt und mit push back in ein Vekotr gefüllt.
    Wie kann ich jeztz einen kontakt alphabetisch sortieren. mit buble sort hab ich es versucht und er würde nur die Vornamen tauschen und dann dem Falschen Nachnamen beispielsweise zuordnen



  • Die STL bietet fertige Sortieralgorithmen an, zB std::sort. Um die Sortierreihenfolge zu bestimmen musst du entweder den Vergleichsoperator operator< für deine Struktur implementieren oder der std::sort Funktion eine Funktion/Funktor/Lambda mitgeben, mit der sie zwei Objekte vergleichen kann.



  • Du musst dann natürlich die ganzen Strukturen tauschen und nicht nur die Vornamen.



  • Sieh dir den Beispielcode auf https://en.cppreference.com/w/cpp/algorithm/sort an. Dort wird auch gezeigt, wie man mit eigenen Vergleichsfunktionen sortieren kann.



  • Zeig doch mal deinen Bubblesort-Quellcode. Vielleicht kann man dir ja helfen 🙂



  • @DerEinmalige sagte in C++ Strukturen in Vekotern sortieren:

    mit buble sort hab ich es versucht

    Nix Code, nix Hilfe.



  • Also habe es gelöst dur rumprobieren ich weiß nicht wie man hier code einfügt also wird der wahrscheinlich bisschen unleserlich. aber für die Leute die Auch Probleme damit haben könnten hier mein weg:

    #include<iostream>
    #include<string>
    #include <vector>
    int eintrag = 0;
    
    typedef struct 
    {
    	std::string first_name;
    	std::string last_name;
    	std::string adresse;
    	int nummer;
    		
    }Kontakt;
    std::vector<Kontakt> mContacts;
    
    bool compare(const Kontakt a, const Kontakt b)
    {
    	return a.first_name < b.first_name;
    }
    std::sort(mContacts.begin(), mContacts.end(), compare);
    
    	int k = 0;
    	for (int i = 0; i < eintrag; i++)
    	{
    
    		std::cout << "(" << k << ") " << mContacts[i].first_name << " " << mContacts[i].last_name << " " << mContacts[i].adresse << " (" << mContacts[i].nummer << ")" << std::endl;
    		k++;
    
    }; 
    

    also mein einziger Fehler quasi war als ich die bool Funktion compare gemacht nicht wusste das ich die structs als const definieren muss. Aber danke für die Hilfe.



  • Rumprobieren ist immer ein schlechtes Zeichen, da kann´s schon mal passieren, dass man die richtige Lösung findet, aber nicht weiß oder versteht, warum sie richtig ist.

    Zu deinem Code:

    • typedef struct benutzt man in C, in C++ reicht struct Kontakt { ... };
    • deine compare Funktion ist zwar richtig, aber da lassen sich ein paar Sachen verbessern:
      • die Parameter werden per Kopie übergeben, das erzeugt massiven Overhead. Besser du übergibst sie als const reference : bool compare( Kontakt const& lhs, Kontakt const& rhs ) { ... }
      • compare ist als Funktionsaufruf implementiert, das der Compiler möglicherweise nicht inlined. Ein Lambda wird so gut wie immer geinlined und bietet bessere Performance.
    • warum benutzt du in deiner Ausgabe die Variable k?


  • @DocShoe
    Ja das ist wahrscheinlich das Problem wenn man verschiedene Tutorials guckt der eine macht es so und der andere wieder anders.
    ich werde es mal mit deinem Ratschlag ändern, danke dafür.
    k ist einfach nur zur schönheit für die Ausgabe. also er zeigt an welcher Kontakt in welcher reihe steht:
    (1) Max Mustermann musterstr (01599382)
    (2) Karl Kamin Hauptstr (0111293)
    (k) vorname nachname adresse (nummer)



  • Vergleiche k mal mit i... 😉



  • @Th69 ,
    kommt wohl aufs selbe hinaus 😃 , ja dumm von mir 😃



  • @DerEinmalige sagte in C++ Strukturen in Vekotern sortieren:

    Ja das ist wahrscheinlich das Problem wenn man verschiedene Tutorials

    Ja das ist wahrscheinlich das Problem wenn man verschiedene Tutorials



  • @DerEinmalige sagte in C++ Strukturen in Vekotern sortieren:

    ich weiß nicht wie man hier code einfügt also wird der wahrscheinlich bisschen unleserlich

    Ja. Offensichtlich.

    Schreibe in eine Zeile vor Deinem Code ``` (oder für C++ auch ```cpp) und eine eine Zeile nach Deinem Code ``` (OHNE cpp). Alternativ markiere Deinen Code und klicke auf das </> in der Toolbar über dem Texteingabefeld. Du kannst Deine Beiträge auch nachträglich Bearbeiten. Den Menüpunkt "Bearbeiten" findest Du hinter dem Drei-Punkte-Menü rechts unter Deinen Beiträgen.

    @DerEinmalige sagte in C++ Strukturen in Vekotern sortieren:

    Tutorials guckt

    Besorg Dir ein Lehrbuch. Bitte. Danke.


Anmelden zum Antworten