objekte löschen dauert zu lange



  • Verwende doch einen Iterator.



  • Sebastian Pizer schrieb:

    Rückwärts mit unsigned int zählen ist gar nicht so einfach.

    Ich glaube, daß es im vorliegenden Fall keinen Grund gibt, den Vektor von hinten nach vorne zu bearbeiten ...
    Also einfach:

    for(unsigned int i = 0; i < vector.size(); ++i)
       delete vector[i];
    


  • huch, es liegt wirklich an der for-schleife

    also der zusammenhang mit der rückwärtszählung und unsigned int?



  • TyRoXx schrieb:

    Tricks gibts da schon, aber keiner ist universell verwendbar:

    [u]3. "Zeigerlose Elemente"

    vector<IObject> m_objects;
    

    Vorteile:
    - könnte Zeit beim Löschen sparen (k. A. wieviel)

    Nachteile:
    - Zeiger auf die Elemente sind gefährlich

    die dritte Variante wollt ich nehmen aber es hat bereits zu tiefe Wurzeln und umbauen folgt mit vielen Fehlern naja.



  • huch, es liegt wirklich an der for-schleife

    Und wie kommst du darauf? Oder duerfen wir wild weiterraten ...



  • xBlackKnightx schrieb:

    huch, es liegt wirklich an der for-schleife

    also der zusammenhang mit der rückwärtszählung und unsigned int?

    Kann gut sein. Auf die Schnelle würde ich sagen, wenn Du nur ein Element im Vektor hast und dann diese Schleife beginnst, läufst Du genau in die von Sebastian Pizer aufgezeigte Falle ...
    Allerdings würde dann wohl das Programm eher abstürzen, als so lange zu laufen ...
    Wie dem auch sei, es gibt keinen (ersichtlichen) Grund, den Vektor von hinten nach vorne zu durchlaufen, und vielleicht kannst Du auch einen signed int als Schleifenzähler nehmen? Dann könntest Du bei Deiner Methode bleiben und 'i < 0' als Abbruchbedingung nehmen.



  • Sebastian Pizer schrieb:

    Rückwärts mit unsigned int zählen ist gar nicht so einfach. 😉
    Hier vergisst Du das erste Element (i==0). Wenn Du aber die Schleife nach

    for ( unsigned int i=vector.size()-1; i >= 0; --i ) {
      delete vector[i];
    }
    

    abänderst, wird es eine Endlosschleife, da ein unsigned int ja nie negativ werden kann. Es müsste aber so gehen:

    for ( unsigned int i=vector.size(); i>0;) {
      --i;
      delete vector[i];
    }
    

    Wenn's auf der Plattform einen typischen Underflow gibt
    assert( size_t(0)-1 == std::numeric_limits<size_t>::max() );
    , geht auch
    for ( size_t i=vector.size()-1; i<vector.size(); --i )
    .

    PS: Unter der Voraussetzung vector.size() < std::numeric_limits<size_t>::max()-1



  • Badestrand schrieb:

    Wenn's auf der Plattform einen typischen Underflow gibt [...]

    Das sollte für unsigned -Typen doch garantiert sein, oder?



  • Nexus schrieb:

    Badestrand schrieb:

    Wenn's auf der Plattform einen typischen Underflow gibt [...]

    Das sollte für unsigned -Typen doch garantiert sein, oder?

    Keine Ahnung, bin nicht so fit mit dem Standard 🙂 Ich schlag mal in einem neueren Draft nach..

    edit: Finde nichts dazu.


  • Administrator

    C++ Standard 14882:2003 - 3.9.1 Fundamental types - Abschnitt 4 schrieb:

    Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2n where n is the number of bits in the value representation of that particular size of integer.

    http://en.wikipedia.org/wiki/Modular_arithmetic

    Also würde ich sagen, dass es sehr genau definiert ist, nicht? Zu Overflow steht es sogar unten explizit als Notiz. Explizit zu Underflow steht allerdings nichts, sollte aber eigentlich aus der Definition hervorgehen.

    Grüssli


Anmelden zum Antworten