String aus vector holen



  • Hallo meine Lieben,

    erst einmal der KONTEXT: ich verpacke drei strings in einen Vektor, um mit diesen drei strings dann in einer anderen Funktion rechnen zu können.

    [Eventuell gibt es dazu sogar eine andere Möglichkeit als diese drei strings in einen Vektor einzuspeichern, ich ging nur davon aus, dass man nur einen Wert retournieren kann, darin liegt aber nicht der Fokus meiner Frage.]

    MEINE FRAGE: Das Problem mit dem Vektor in der anderen Funktion ist, dass die strings wieder aus dem Vektor extrahieren werden sollten, nur weiß ich nicht wie das geht.

    Unten mein Code: Aufgabe ist es drei strings der Länge nach zu sortieren.

    Ich bin für jede Hilfe dankbar!

    #include <iostream>
    #include <string>
    #include <cassert>
    #include <vector>
    
    using namespace std;
    string sort(vector<string>satz){
    
        string neu;
    
        cout << satz.at(0) << endl;
    
        
    
        return 0;
    }
    string trennen(string all){
        string eins;
        string zwei;
        string drei;
        all = all + " ";
        for(int n = 0; int(all.at(n)) != 32; n++){
            eins.push_back(all.at(n));   
        }
    
        for(int n = eins.length() + 1; int(all.at(n)) != 32; n++){
            zwei.push_back(all.at(n));
        }
    
        for(int n = eins.length() + zwei.length() + 2; int(all.at(n)) != 32; n++){
            drei.push_back(all.at(n));
        }
    
        cout << eins << endl << zwei << endl << drei << endl;
    
        vector <string> satz;
        satz.push_back(eins);
        satz.push_back(zwei);
        satz.push_back(drei);
    
    
        
    
    
        return sort(satz);
    
    
    }
    int main(){
        string wort;
        cout << "Geben Sie drei strings ein, die ihrer Länge nach sortiert werden sollen." << endl;
        getline(cin, wort);
        trennen(wort);
        
        return 0;
    }
    
    
    


  • @marktheshark
    hast Du doch schon?!
    auf Zeile 11 holst Du den ersten Eintrag aus dem Vektor (Index 0) - mit Index 1 bekommst Du den zweiten usw.



  • @Belli an sich schon. Ich würde aber gerne den Eintrag in einen String einspeichern:

    eins.push_back(satz.at(0));
    

    das geht aber leider nicht.



  • Du meinst

    string eins = satz.at(0);
    // ...
    

    !?

    PS: Statt int(all.at(n)) != 32 solltest du besser all.at(n) != ' 'schreiben.
    Und noch einfacher ginge das Einlesen der drei Worte mittels

    cin >> eins >> zwei >> drei;
    

    Dann brauchst du nicht danach die Worte selber daraus extrahieren.



  • @Th69 ah top! Danke! und auch vielen Dank für

    cin >> eins >> zwei >> drei;
    

    hätte mir einiges an Arbeit erspart, hätte ich das früher gewusst😅



  • @Th69 es ist aber bei

    cin >> eins >> zwei >> drei;
    

    dennoch nötig die drei strings in einen vector zu verpacken oder, um die drei Werte in einer anderen Funktion wieder aufrufen zu können?



  • Du kannst natürlich prinzipiell eine Funktion:

    void func(string eins, string zwei, string drei)
    {
       // ...
    }
    

    schreiben und so aufrufen:

    func(a, b, c);
    

    vorausgesetzt, um a, b und c handelt es sich auch um string oder um Typen, mit denen ein string konstruiert werden kann ...

    Wenn Du aber, wie Du es hast, einen vector übergibst, bist Du nicht auf genau drei Werte festgelegt, vielleicht enthält Dein vector ja irgendwann mal mehr (oder weniger) als genau drei Werte ...



  • @marktheshark sagte in String aus vector holen:

    string sort(vector<string>satz){

    Du solltest versuchen, eine möglichst grundlegende Funktion zu entwerfen, die dein Problem, aber möglicherweise auch andere Probleme löst.

    Die Aufgabe "Sortiere 3 Strings nach Länge" unterscheidet sich im Wesentlichen nicht besonders von der Aufgabe "Sortiere 4 Strings nach Länge" oder gar "Sortiere 1 Million Strings nach Länge". Von daher ist der Ansatz mit einem Vektor auf jeden Fall allgemeiner als der mit drei einzelnen String-Variablen. Dann kann man weitermachen: will man immer nach Länge sortieren oder z.B. auch mal nach anderen Kriterien (dann müsste man die Vergleichsfuktion per Parameter übergeben) oder will man statt Strings auch mal andere Dinge sortiere wie z.B. Zahlen - dann müsste man den Typ parametrisieren. Wie weit man verallgemeinern will, ist dabei immer eine Frage.

    Nun gibt es noch ein paar Dinge zu beachten:

    1. Oftmals sind für wenige Elemente (0, 1, 2, machmal auch 3, z.B. "Sortiere 2 Strings nach Länge") einfachere Algorithmen als ganz allgemeine Verfügbar. D.h. wenn man immer nur 2 Elemente nach Länge sortieren muss, braucht man keine allgemeine Funktion für n Elemente. Andererseits kann man eine allgemeine Funktion natürlich auch für 2 Elemente nutzen.

    2. Was soll deine Funktion eigentlich zurückgeben? Du gibt einen vector<string> rein (also beliebig viele Strings), aber du returnst einen einzigen string. Du hast hier generell zwei Optionen: a) returne ebenfalls einen vector<string>, welcher die Strings in sortierter Reihenfolge enthält. b) ändere die Reihenfolge direkt in dem vector, den du als Parameter übergeben bekommst. Hierbei hat a) den Vorteil, dass der eingegebene Parameter unverändert bleibt, aber als Nachteil hast du doppelten Speicherbedarf. Bei b) ists umgekehrt.

    3. Beachte, wie du den Parameter übergibst. Dein string sort(vector<string>satz) übergibt den vector per Value (d.h. es wird eine Kopie erzeugt). Nimm stattdessen entweder vector<string> sort(const vector<string> &satz) (also mit const&), wenn du ihn nicht ändern willst - oder void sort(vector<string> &satz) wenn du inplace ändern willst.

    4. Ggf. solltest du dir auch mal anschauen, wie Sortieren mit der Standardbibliothek funktioniert: a) die Parameter sind Iteratoren, nicht ein ganzer Vektor - dann kann man die Funktion auch auf z.B. Arrays anwenden oder Teile von Vektoren oder Arrays (oder auf ganz andere, aber ähnliche Strukturen). b) die Sortierfunktion ist parametrisierbar. Siehe https://en.cppreference.com/w/cpp/algorithm/sort
      Wenn du also einen Vektor mit Strings hast, kannst du so nach Länge sortieren:

    std::vector<std::string> strings = {"Hallo", "aus", "Norddeutschland"};
    std::sort(strings.begin(), strings.end(), [](const std::string &a, const std::string &b){return a.size() < b.size();});
    // strings ist jetzt nach Länge sortiert: aus, Hallo, Norddeutschland
    


  • @wob Vielen vielen Dank! Das ist sehr hilfreich. Unglaublich wie ausführlich deine Antwort ist! Echt klasse! Gehe das jetzt einmal alles genauer durch..🤩 👏🏼 👏🏼


Log in to reply