C++ Vector mit Struct, v.erase benutzen



  • Hallo

    Ich lerne momentan Vectoren zu benutzen und habe gerade ein Problem.

    struct Marke
    {
    	 int Eintrag;
    	 char Name[30];
    };
    
      vector<Marke> vec(10);
    
      vec[0].Eintrag = 1;
      strcpy(vec[0].Name, "Hallo");
    

    Ich weiss das macht absolut keinen Sinn aber ich bin halt am probieren. Nun möchte ich diesen Eintrag wieder löschen.

    Mit dem erase komme ich einfach nicht klar:
    v.erase(i); Entfernt das Element i aus v.

    Wie entferne ich nun zb den Eintrag bei [0]?

    Danke für eure Hilfe

    Gruss

    Typhoon



  • v.erase (v.begin ());
    

    ?! 🙄

    EDIT:
    Du brauchst einen Iterator.



  • Ahh das funktioniert sogar.

    Habs noch ein bisschen abgeändert, immer Speicherplätze zu reservieren macht ja keinen Sinn oder?

    vector<Marke> vec;
    
      Marke heini;
      heini.Eintrag = 1;
      strcpy(heini.Name, "Hallo2");
    
      vec.push_back(heini);
    

    Ich werds nachher noch mit Konstruktoren probieren, habe darüber gelesen.

    Nochmal ne merwürdige Frage 😃 Nehmen wir an ich habe nun 3 Einträge in dem Vektor gespeichert, wie kann ich mit einem Iterator auf den zweiten zeigen? (Um ihn zb mit erase(i) zu löschen)

    Danke



  • http://www.cplusplus.com/reference/stl/vector/

    iterator einfach inkrementieren.

    std::vector<T> v;
    std::vector<T>::iterator it = v.begin (); //erstes Element
    
    ++it; //zweites Element usw.
    
    it = v.end (); // nach dem letzten Element (nicht T !)
    


  • Danke

    Nochmal ich

    vector<Marke> vec;
      vector<Marke>::iterator it = vec.begin ();
    
      Marke heini;
    
      heini.Eintrag = 1;
      strcpy(heini.Name, "Hallo");
      vec.push_back(heini);
    
      strcpy(heini.Name, "Hallo1");
      vec.push_back(heini);
    
      strcpy(heini.Name, "Hallo2");
      vec.push_back(heini);
    
      strcpy(heini.Name, "Hallo3");
      vec.push_back(heini);
    
      vec.erase(it);
    

    Kannst du mir sagen wieso beim Ausführen das Programm crasht mit der Meldung: vector erase iterator outside range

    Kann man eine Position auch direkt anspringen, sowas wie it = 3? Oder muss man sich dann eine for-Schleife machen?

    Gruss



  • Schreib 100x: Du sollst Iteratoren nicht speichern!
    Danach rückst du die Zeile vector<Marke>::iterator it = vec.begin (); direkt vor das erase.



  • Du bist genial 🙂

    Wenn ihr an den zehnten Eintrag wollt, macht ihr dann:

    for(int i=0; i<10; i++)
    it++;

    oder geht das auch schneller?

    Super hilfe hier 🙂



  • vector hat RandomAccess-Iteratoren. Du kannst also direkt 10 auf den Startiterator aufaddieren. Oder einfach vec[9] schreiben, wie bei einem normalen Array


Anmelden zum Antworten