Problem beim Ändern des Inhalts eines Vectors(Anfänger)



  • Da dies mein erster Post in diesem Forum ist erstmal ein Herzliches Hallo an alle!!

    Zu meinem Problem:
    Ich habe in dem Vector<string> myTokens mehrere Wörter gespeichert z.B hamburg. Die einzelnen vector einträge möchte ich jetzt in die Form "ha - hamburg". das heißt also die ersten beiden Buchstaben aussondern und mit einem Bindestrich davorstellen.

    Mein Ansatz war nun die einzelnen Vector Positionen in einem String zwischenzuspeichern, abzuändern, und wieder in dem Vector zu speichern:

    for(size_t i = 0; i < myTokens.size(); ++i)
                {
                           string str;
                           str.insert(str.begin(),myTokens[1].substr(0,2));
                           str.insert(str.end()," - ");
                           str.insert(str.end(),myTokens[i]);
                           myTokensi.assign(i,str);
                }
    

    Hierbei bekomme ich aber beim compilieren mehrere Fehler, welche ich aber nicht genau durchblicke.
    Meine Frage wäre nun, was ist in meiner Ausarbeitung falsch und vielleicht ob ich komplett falsch denke und mein Ansatz schon schwachsinn ist?

    Zum Überlick hier die gesamte Aufgabenstellung:

    Alle Worte eines Textes sollen aus einer Textdatei eingelesen
    und alle Buchstaben in Kleinbuchstaben verwandelt werden.
    Danach sollen die Worte sortiert und wieder ausgegeben werden.
    Interpunktionen und Zahlen werden dabei ignoriert. Die
    Ausgabe soll dabei nach den beiden Anfangsbuchstaben der
    Worte gruppiert werden. Innerhalb dieser Gruppen erfolgt die
    Ausgabe in umgekehrter alphanumerischer Reihenfolge. Doppelte
    Worte werden nur einmal mit der Häufigkeit ihres Auftretens
    ausgegeben.

    Wenn ihr mein komplettes Programm braucht sagt kurz bescheid, ich wollte eure Geduld erstmal nicht überstrapazieren.

    Vielen Dank schon im Voraus!!!

    Label



  • Warum machst du es dir so unnötig schwer?

    for(size_t i = 0; i < myTokens.size(); ++i)
    {
    
       if(myTokens[i].size()>2)
       {
           string tmp( myTokens[i].begin(), myTokens[i].begin()+2 ); //erstelle string aus den ersten zwei Buchstaben aus myTokens
           myTokens[i] = tmp + " - " + myTokens[i];
       }
    }
    


  • Vielen dank, klappt einwandfrei.

    Ich hab das so umständlich gemacht weil ich noch nicht so sicher mit C++ bin. Das verbunden mit einem ordentlichen Gehirnknoten ergibt so schöne Konstrukte.

    Danke nochmal.

    Label



  • Label schrieb:

    Doppelte Worte werden nur einmal mit der Häufigkeit ihres Auftretens ausgegeben.

    Hört sich stark nach einem Anwendungsgebiet für std::map an



  • Hmm das könnte interessant werden, damit hab ich mich noch gar nicht Beschäftigt. Aber danke für den Hinweis.



  • Nachdem ich kleine veränderungen gemacht habe geht es nun doch nicht mehr.

    asdasd schrieb:

    Warum machst du es dir so unnötig schwer?

    for(size_t i = 0; i < myTokens.size(); ++i)
    {
       
       if(myTokens[i].size()>2)
       {
           string tmp( myTokens[i].begin(), myTokens[i].begin()+2 ); //erstelle string aus den ersten zwei Buchstaben aus myTokens
           myTokens[i] = tmp + " - " + myTokens[i];
       }
    }
    

    Ich hab das Problem jetzt wie folgt gelöst, aber der Fehler trat auch schon bei asdasd Lösung auf:

    for(size_t i = 0; i < myTokens.size(); ++i)
                  myTokens2[i].assign( myTokens[i].begin(), myTokens[i].begin()+2);
    

    Zwar compiliert er damit ohne fehler aber beim Ausführen stürzt das Programm etwa an der Stelle ab. Ich weiß aber leider nicht warum?

    Edit:
    Ich habe den teil mal zur Überprüfung umgeschrieben:

    for(size_t i=0;i<myTokens.size();i++)
    cout <<  myTokens[i] << "\n";
    
                for(size_t i = 0; i < myTokens.size(); ++i)
                {
                           if(myTokens[i].size()>2)
                           {
                                                   string tmp( myTokens[i].begin(), myTokens[i].begin()+1 );
                                                   myLetters[i] = tmp;
                           } cout << myTokens[i]<< " -" << myLetters[i] << "\n";   
                }
    

    Zunächst wir "myToken" komplett ausgegeben, dann aber bei der ausgabe von "myToken" und "myLetters" wird nur der erste Punkt aus "myToken" und der Bindestrich ausgegeben und danach stürzt das Programm ab.

    Edit2:
    Bei der Fehlersuche mit Dev C++ zeigt er mir an:

    Eine zugriffsverletzung (Segmentation Fault) trat in Ihrem Programm auf.
    Label



  • Ok da ich sowieso mit einem map Container weiter arbeite, hab ich das Problem wie folgt gelöst:

    for(size_t i = 0; i < myTokens.size(); ++i)
                {
                           if(myTokens[i].size()>1)
                           {
                                                   string tmp( myTokens[i].begin(), myTokens[i].begin()+2 );
                                                   myMap.insert(pair<string,string>(tmp,myTokens[i]));                //Die vectoren in dem map Container speichern
                           } 
                }
    

    Aber trotzdem weiß ich nicht wieso es vorher mit dem 2. Vector nicht geklappt hat.


Anmelden zum Antworten