Vector in Vector schreiben



  • Hallo community,

    ich versuch eine vector in den anderen zu schreiben.
    Bis jetzt hab ich das

    std::vector<std::string> Backup,final;
    
    for(int i = 0; i<Backup.size(); i++) {
    		 Backup[i] = final[i+1];
    }
    

    Das 0 Element von final ist schon beschrieben und ich möchte es nicht überschreiben, deswegen soll ein element von Backup immer ein element höher in final geschrieben werden.

    Wenn ich das jetzt compeliere bekomme ich einen Fehler

    vector subscript out of range

    Hat jemand einen anreiz? Aber bitte keine vollständige Lösung, da ich wircklich etwas lernen möchte.
    Danke



  • win32 schrieb:

    Das 0 Element von final ist schon beschrieben und ich möchte es nicht überschreiben, deswegen soll ein element von Backup immer ein element höher in final geschrieben werden.

    Hier wird aber final in Backup geschrieben, deshalb solltest du Backup vor der Schleife auf die richtige Größe bringen und dann stimmt die Bedingung auch mit i + 1 < final.size() überein.



  • Tut mir leid, ich habe deine Post nicht ganz verstanden.

    Ich will nur alle elemente von Backup in final speichern, doch dass das kopieren der Backup-Elemente erst beim 1. element von final anfängt.



  • win32 schrieb:

    Tut mir leid, ich habe deine Post nicht ganz verstanden.

    Ich will nur alle elemente von Backup in final speichern, doch dass das kopieren der Backup-Elemente erst beim 1. element von final anfängt.

    Du schreibst

    Backup[i] = final[i+1];
    

    und willst Backup in final kopieren?

    Mit meinem Post wollte ich sagen, dass final.size() + 1 == Backup.size() gelten sollte.



  • Achso als das ich final erst die gleiche größe zuweiße wie die von Backup damit ich nicht in nicht existierende elemente schreibe ?



  • win32 schrieb:

    Achso als das ich final erst die gleiche größe zuweiße wie die von Backup damit ich nicht in nicht existierende elemente schreibe ?

    Nein, eins größer, weil du ja das erste Element nicht überschreiben willst.



  • Du schreibst, dass du final nicht überschreiben willst, schreibst aber in backup und nicht in final?

    jedenfalls gibts 2 möglichkeiten:

    std::vector<std::string> a, b;
    /* a füllen */
    b[0] = "asd";
    b.resize(a.size()+1);
    for(auto i = a.begin(), e = a.end(); i != e; ++i)
      b = *a;
    

    oder

    std::vector<std::string> a, b;
    /* a füllen */
    b[0] = "asd";
    b.reserve(a.size()+1);
    for(auto i = a.begin(), e = a.end(); i != e; ++i)
      b.push_back(*a);
    

    natürlich kannst du die schleifen auch (mit std::copy) verstecken, falls dir das lieber ist.

    bb



  • win32 schrieb:

    ich versuch eine vector in den anderen zu schreiben.
    Bis jetzt hab ich das

    std::vector<std::string> Backup,final;
    
    for(int i = 0; i<Backup.size(); i++) {
    		 Backup[i] = final[i+1];
    }
    

    Das 0 Element von final ist schon beschrieben und ich möchte es nicht überschreiben, deswegen soll ein element von Backup immer ein element höher in final geschrieben werden.

    Das mit der Zuweisung funktioniert so, dass der Wert der rechten Seite dem Objekt der linken zugewiesen wird. Du kopierst hier also Werte aus final nach Backup und nicht umgekehrt.

    win32 schrieb:

    Wenn ich das jetzt compeliere bekomme ich einen Fehler

    vector subscript out of range

    Du kannst nur auf Vektorelemente zugreifen, die es auch gibt. "out of range" heißt hier, dass du einen Index k verwendest, für den nicht 0 <= k < dervector.size() gilt. In Deinem Fall wahrscheinlich k=i+1 und dervector=final.

    Eine Schleife musst du hier übrigens nicht selbst schreiben. Für ein solches Kopieren gibt es schon std::copy aus dem <algorithm> -Header.



  • win32 schrieb:

    Hat jemand einen anreiz?

    http://www.cplusplus.com/reference/stl/vector/insert/ - die dritte Variante.



  • Ah nun ist mir einiges mehr klar.Danke an euch alle und besonders krümelkacker; hat mir sehr geholfen was du gepostet hast.



  • @unskilled: Was sollen denn die Anweisungen in den Schleifen?



  • wxSkip schrieb:

    @unskilled: Was sollen denn die Anweisungen in den Schleifen?

    oha - ich nehm mal an, du meintest das hier:

    std::vector<std::string> a, b;
    /*...*/
    for(auto i = a.begin(), e = a.end(); i != e; ++i) 
      b = *a;
    

    ist natürlich ein wenig fail von mir gewesen. nachdenken 4tw 😃

    for(auto i = 0, e = a.size(); i != e; ++i)
      b[i+1] = a[i];
    

    falls du was anderes meintest... weiß ich nicht, was du meinst^^

    bb


Anmelden zum Antworten