std::vector size /resize /reserve?



  • habe einen Vector und mach folgenes:

    std::vector<XXX> vec(2);
    
    vec.reserve(64);
    
    vec.pushback(...);
    vec.pushback(...);
    
    vec.resize(3);
    
    vec.pushback(...);
    

    durch reserve/resize werden die vorhanden elemente nich gelöscht odER?



  • Durch reserve() wird nichts gelöscht (und wenn du weniger angibst als die bisherige Kapazität des vector<>s, passiert gar nichts. Bei resize() werden die überschüssigen Elemente gelöscht, wenn der vector verkleinert wird.



  • wenn ich das richtig im Kopf hab ist reserve fuer den Compiler eh nur eine Richtlinie, keine Regel (sprich er muss nicht unbedingt den ganzen Platz reservieren). Auf jeden Fall wird ein reserve() aber den vector nicht verkleinern. Ein resize() wiederum nimmt keine Ruecksicht auf die anzahl der Elemente, was zuviel ist wird gekillt.
    In deinem Beispiel bedeutet das:
    - vec hat am Anfang 2 elemente (default-initialisiert), reserviert dann Speicher fuer insgesamt 64
    - 2 pushbacks machen 4 elemente
    - resize(3) killt das letzte
    -pushback() => wieder 4



  • BorisDieKlinge schrieb:

    habe einen Vector und mach folgenes:

    std::vector<XXX> vec(2);
    

    Jetzt hast du einen Vektor mit zwei Elementen, d.h. vec.size() == 2 und vec.capacity() >= 2

    vec.reserve(64);
    

    Nach wie vor zwei Elemente und vec.capacity() >= 64

    vec.pushback(...);
    vec.pushback(...);
    

    Abgesehen davon, dass die Methode push_back heißt, hat dein Vektor nun 4 Elemente. D.h. vec.size() == 4, vec.capacity() >= 64

    vec.resize(3);
    

    Jetzt hat dein Vektor nur noch drei Elemente, das letzte Element wurde also entfernt. vec.size() == 3, vec.capacity() >= 64

    vec.pushback(...);
    

    Wieder bei vier Elementen. vec.size() == 4, vec.capacity() >= 64

    durch reserve/resize werden die vorhanden elemente nich gelöscht odER?

    resize löscht Elemente, falls newSize < vec.size(). Nach resize gilt also immer:
    vec.size() == newSize.

    reserve hingegen vergrößert immer nur die Kapazität. D.h. falls newCapacity < vec.capacity() passiert nix. Nachher gilt immer: newCapacity <= vec.capacity().



  • pumuckl schrieb:

    wenn ich das richtig im Kopf hab ist reserve fuer den Compiler eh nur eine Richtlinie, keine Regel (sprich er muss nicht unbedingt den ganzen Platz reservieren).

    Er muß mindestens den angegebenen Platz reservieren, kann aber auch mehr anfordern (und er darf seine Kapazität nicht verkleinern).



  • wenn die größe anfangs auf 2 steht, und ich mit reserve auf 4!

    ich dann mit push_back ein drittes Element anfüge, wird dann der vector umkopiert?



  • Der Vektor wird erst umkopiert, wenn er an die Kapazitätsgrenze stößt - nach dem reserve(4) wird die Kapazität auf (mindestens) 4 gesetzt, so daß das Einfügen eines dritten (und vierten) Elements ohne Umkopieren möglich ist.

    (informiere dich doch mal über den Unterschied zwischen "Größe" (tatsächlich vorhandene Elemente - size()/resize()) und "Kapazität" (verfügbarer Platz für weitere Elemente - capacity()/reserve()) ;))


Anmelden zum Antworten