Kopien und Zuweisungen von Klassenobjekten



  • sfasdfdsf schrieb:

    wenn du den vector veränderst (vergrösserst usw) muss u.U. neuer speicher reserviert werden. dann werden deine alten zeiger ungültig...

    hmmm..... du meinst, der Speicher wäre nicht mehr zusammenhängend?

    Oder meinst du, den vector miststueck darf ich nicht mehr anfassen? (den brauch ich ja dann auch nicht mehr!)



  • nein ich meine damit, dass der vector z.b. 5 elemente gespeichert hat (deren ardresse du nun genommen hast z.b.). wenn du dann plötzlich ein 6tes benötigst (push_back), dann muss sich der vector neuen speicherplatz anschaffen (ausser er hat im voraus reserviert mit vector::reserve()). da der vector aber nur mit zusammenhängendem speicher arbeitet bedeutet das, dass er sich neuen, grösseren speicher holt, den alten dahin in den neuen kopiert und dann den alten löscht, dann werden auch alle zeiger und iteratoren ungültig. dieses problem hast du z.b. mit std::list nicht (dafür ist z.b. zugriff in O(log n)).

    tl;dr -> du solltest es lassen wenn du es nicht unbedingt brauchst.



  • Ah, klar. Das ist nachvollziehbar! 🙂

    Ich kann aber absehen, dass ich maximal 5 push_backs habe!
    Ich hab mal folgendes ausprobiert:

    std::cout << "Kapazitaet: " << miststueck.capacity() << "  ";
        miststueck.reserve(5);
        std::cout << " Kapazitaet: " << miststueck.capacity() << "\n";
    

    (Wenn ich jetzt über die 5 Elemente gehe, kann ich erwarten, dass der Speicher neu allokiert wird, aber drunter ist es sicher, dass er da bleibt wo er ist.)
    Der Anfangswert für "0" capacity() sagt nur, dass noch nix reserviert ist, aber nichts darüber, wieviel Platz eigentlich vorhanden ist. Oder?!

    Noch eine Frage: 🙂
    einmal vector.clear() aufzurufen löscht den Inhalt, aber der Speicher bleibt reserviert, also capacity() bleibt so wie es ist, oder? Bzw. wenn man den Vector neu füllt, füllt er sich exakt an der selben Stelle (es sei denn, man geht mit der Anzahl seiner Elemente drüber, dann muss er u.U. neu allokieren)?

    Merci!
    Ist sehr interessant mit dir 🙂



  • gute idee von dir mit dem reserve()! capacity() gibt in der tat zurück, wie viel speicher intern von vector angefordert wurde. jedoch: reserve() ist ein hinweis an die implementierung. ein hinweis, welcher die implementierung auch ignorieren könnte. wenn du dir also sicher sein willst, mach resize(), hol dir dann deine adressen und lass den vector dann. noch besser, du machst einen const std::vector<T> , initialisierst den mit einer initialiser-list (c++11-feature) und kannst dir dann sicher sein, dass deine adressen für immer richtig sind. wenn du dann die grösse noch zu compilezeit wissen solltest (denke schon, dass es so ist), dann kannst du auch ein std::array nehmen, da man das nicht vergrössern / verkleinern kann, ist es sicher, dass die zeiger und iteratoren immer gültig sind (ausser sie haben eine längere lebensdauer als das std::array selbst).

    ob der speicher erhalten bleibt bei vector::clear ist meinem wissen nach nicht explizit definiert, ergo implemention-defined. das heisst, du darfst dich nicht darauf verlassen wenn du portablen und guten code schreiben möchtest.



  • capacity() gibt in der tat zurück, wie viel speicher intern von vector angefordert wurde.)

    Wo bleibt dann der Unterschied von size() und capacity() ?

    Ich glaube, ein festes Array ist eine gute Option.
    (Aber inzwischen denke ich, mach ich meinen Vector über A* um 5 größer. Dann hab ich den Hick Hack gar nicht. Dann muss ich nur meine Abfragen ändern ... 😉 )

    Aber es ist immer wieder schön zu wissen, was möglich ist .. 🙂



  • Lymogry schrieb:

    capacity() gibt in der tat zurück, wie viel speicher intern von vector angefordert wurde.)

    Wo bleibt dann der Unterschied von size() und capacity() ?

    size() gibt dir die anzahl der einträge zurück, auf die du dich verlassen kannst. capacity() ist implementation-defined und somit kannst du das verhalten nicht voraussehen. das verhalten von size() ist jedoch trivial, fügst du elemente hinzu oder löscht du welche, dann wird der rückgabewert von size() grösser bzw. kleiner (um die entsprechende anzahl). ausserdem solltest du nur auf elemente bis [size() - 1] zugreifen, nicht bis [capacity() - 1].

    Lymogry schrieb:

    Aber es ist immer wieder schön zu wissen, was möglich ist .. 🙂

    ja da hast du recht.



  • Prima! 👍

    Danke asdfsaf für deine Geduld und die ganzen tollen Hilfen und Infos 🙂 👍


Anmelden zum Antworten