std::vector< irgendein *> destruktoraufruf?



  • Shade Of Mine schrieb:

    drakon schrieb:

    Jop. Aber normalerweise ist das nicht einfach so leer. 😉
    Da hat es für gewöhnlich noch Bedinungen drinnen, wann etwas gelöscht werden soll.

    dann std::remove_if verwenden.

    So einfach ist immer noch nicht. 😉
    Hätte ich vlt. auch noch schreiben sollen, dass da zuerst auch noch für jedes Element irgendwas gemacht wird. (wie updaten oder irgendwelche Werte setzen usw. ).
    Und ehrlich gesagt ich mag das nicht, wenn ich da extra ne Klasse/Funktion schreiben muss, nur, dass ich das so übergeben kann. Da bevorzuge ich die ausgeschriebene Schleife, oder, wenn nichts gelöscht wird BOOST_FOREACH. (Ist imo auch viel lesbarer und mitunter ein Grund, warum ich mich so richtig auf lambda Ausdrücke freue. :))



  • Es wird bearbeitet und geloescht?
    Klingt wie wenn eine Funktion 2 aufgaben hat...

    Aber auch hier hilft dir remove_if. Da du im predicate durchaus auch aenderungen an den uebergebenen daten durchfuehren kannst.

    der punkt ist halt, dass so eine schleife mit staendigem erase furchtbar lahm ist. ich verstehe nicht warum du daran unbedingt festhalten willst.

    std::remove_if ist hier genau das richtige und mit remove_if wird die funktion auch sogar komplett gratis exception sicher (sofern das predicate nicht wirft)...



  • Ich sage ja nicht, dass ich das immer so mache, aber manchmal habe ich es halt so, dass ich eine Liste habe und da müssen gewisse Sachen für jedes Objekt in der Liste in jedem Durchgang gemacht werden. Und da prüfe ich halt am Ende der Schleife noch darauf, ob das Objekt noch lebt, oder nicht und entferne es gegebenermassen aus der Liste. Ich sehe nicht ein, warum ich das ausserhalb dieser Schleife prüfen soll, wenn ich das in der Schleife drin praktisch Gratis haben kann. (Ist dann 1 zusätzlicher getter und wenn nichts gemacht wird, bleibt das Objekt drin.)
    Wenn ich da jetzt noch danach ein remove_if habe, dann muss der ja auch durch die ganze Liste durch und das ist imo unnötig, wenn ich sowieso durch jedes Element gehen muss.

    Und wie meinst du das mit dem ständigem erase? - Es wird ja nicht immer gelöscht, sondern nur, wenn das Objekt weg soll..



  • drakon schrieb:

    Wenn ich da jetzt noch danach ein remove_if habe, dann muss der ja auch durch die ganze Liste durch und das ist imo unnötig, wenn ich sowieso durch jedes Element gehen muss.

    Dann mach nur ein remove_if ohne schleife vorher... remove_if geht ja alle Elemente durch und wendet ein predicate darauf an.

    Und wie meinst du das mit dem ständigem erase? - Es wird ja nicht immer gelöscht, sondern nur, wenn das Objekt weg soll..

    Bei einer std::list ist ein erase ja quasi gratis. Aber was passiert bei einem erase bei einem vector? alle nachfolgenden objekte werden umkopiert.

    du hast also eine exponentielle laufzeit im vergleich zu einer linearen. mit remove_if ist du garantiert linear.

    was genau stoert dich an remove_if?



  • Shade Of Mine schrieb:

    was genau stoert dich an remove_if?

    Ganz konkret in dem Fall? - Der Name und dass ich alles in eine Klasse/Funktion stopfen muss und wenn ich andere Werte brauche, die vom Aufrufer kommen ich die übergeben muss.
    Der Name aus dem Grund, dass ich nie auf die Idee kommen würde in einer Funktion, die remove heisst etwas, wie eine update Funktion aufzurufen. Klar ist es möglich, aber imo unintuitiv.
    Das mit der Laufzeit ist natürlich ein Argument. Werde es mir mal anschauen. Vlt. finde ich auch einen Alternative, die das auch anbietet.
    Danke für den Hinweis.



  • dann scheib dir eine funktion die update_and_remove_if heisst oder so. Ist ja trivial. Und du kannst ja normale functors verwenden, ergo sind uebergebbare werte ja kein problem. kannst sogar boost::lambda verwenden was zB bei deiner schleife nicht moeglich ist...



  • Shade Of Mine schrieb:

    dann scheib dir eine funktion die update_and_remove_if heisst oder so. Ist ja trivial. Und du kannst ja normale functors verwenden, ergo sind uebergebbare werte ja kein problem. kannst sogar boost::lambda verwenden was zB bei deiner schleife nicht moeglich ist...

    Jup. Fals nötig werde ich das so machen. Allerdings habe ich dort, wo ich das so mache immer listen, da ich ja davon ausgehe, dass da viel rein/rausgeht und somit spielt es nicht wirklich eine wichtige Rolle.

    Die Übergabe stelle ich mir aber umständlich vor, wenn ich z.B 4-5 Werte habe, dann muss ich die alle übergeben und im Objekt speichern, was ich irgendwie ungeschickt finde.



  • Shade Of Mine schrieb:

    Bei einer std::list ist ein erase ja quasi gratis. Aber was passiert bei einem erase bei einem vector? alle nachfolgenden objekte werden umkopiert.

    du hast also eine exponentielle laufzeit im vergleich zu einer linearen. mit remove_if ist du garantiert linear.

    quadratisch..



  • drakon schrieb:

    Die Übergabe stelle ich mir aber umständlich vor, wenn ich z.B 4-5 Werte habe, dann muss ich die alle übergeben und im Objekt speichern, was ich irgendwie ungeschickt finde.

    deshalb lambda funktionen verwenden...?

    Aber 4-5 unterschiedliche werte die nicht in einer klasse zusammen gefasst sind, klingt auch etwas komisch...



  • Shade Of Mine schrieb:

    drakon schrieb:

    Die Übergabe stelle ich mir aber umständlich vor, wenn ich z.B 4-5 Werte habe, dann muss ich die alle übergeben und im Objekt speichern, was ich irgendwie ungeschickt finde.

    deshalb lambda funktionen verwenden...?

    Mit closures sehr gerne, ja.



  • Sodele, ich hab ein Problem mit besagtem ptr_vector:

    wenn ich das #include <boost/ptr_container/ptr_vector.hpp>
    setze, obwohl ich noch keine Zeile Code mit diesem konstrukt geschrieben habe, bekomme ich folgende Fehler:

    In file included from /usr/include/boost/ptr_container/detail/scoped_deleter.hpp:21,
    from /usr/include/boost/ptr_container/detail/reversible_ptr_container.hpp:21,
    from /usr/include/boost/ptr_container/ptr_sequence_adapter.hpp:20,
    from /usr/include/boost/ptr_container/ptr_vector.hpp:20,
    from logichandler.cpp:11:
    /usr/include/boost/scoped_array.hpp: In member function ‘T& boost::scoped_array<T>::operator[](ptrdiff_t) const’:
    /usr/include/boost/scoped_array.hpp:80: error: there are no arguments to ‘assert’ that depend on a template parameter, so a declaration of ‘assert’ must be available
    /usr/include/boost/scoped_array.hpp:80: error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)

    Was läuft hier schief? So gut gewartete Sachen wie boost werden sich ja wohl nicht auf veraltete Compilerflags verlassen ?!



  • Includier einfach <cassert> vorher 🙄


Anmelden zum Antworten