Standardkonstruktor für resize ?



  • Hallo, ich wollte folgenden Code schreiben:

    ani.resize( remove_if(ani.begin(), ani.end(), is_bad_name) - ani.begin() );
    

    ani ist ein vector. is_bad_name die prädikatfunktion für remove if. Wenn ich das kompilieren möchte bekomme ich eine Fehlermeldung, dass der Standardkonstruktor privat ist (was auch stimmt). Aber wo wird denn im Code oben der Standardkonstruktor aufgerufen??



  • resize ist als methode eines klassentemplates selber eine templatefunktion und wird erst instantiiert wenn du sie auch benutzt. Und da resize auch den Fall abhandeln muss wo der vector vergrößert wird hat es als zweiten Parameter einen Defaultparameter, nämlich T() - also wird der Aufruf vo T() instantiiert, auch wenn du den vector verkleinerst. Ein workaround wäre also

    ani.resize( remove_if(ani.begin(), ani.end(), is_bad_name) - ani.begin(), ani.front() );
    

    - du benutzt einfach das erste Element als die nie benutzte Vorlage für resize()

    Das könnte als workaround funktionieren. Ich schreib könnte, weil nicht gesagt ist, dass der default-Ctor nicht anderweitig steht. std::vector hat eben als Voraussetzung, dass die Elemente default-kontruierbar sind.



  • @Stily:
    gibt es einen grund warum du nicht wie vorgesehen erase() verwendest? oder hast du bloss rumprobiert, und wolltest jetzt wissen wieso das mit resize() nicht geht?



  • In allen Beispielen, die ich bisher gesehen habe, wurde immer unique/resize oder remove/resize verwendet. Daher dachte ich, dass es der "normale" weg sei, resize erase vorzuziehen. Welche vorteile hätte denn erase? (außer, dass es vielleicht keinen Standardkonstruktor braucht)



  • ich finde es logischer.
    ganz einfach weil ich es unlogisch finde, vom iterator den remove_if zurückgibt, auf eine anzahl zurückzurechnen, wenn man den iterator auch direkt weitergeben kann.

    container.erase(remove_if(container.begin(), container.end(), condition), container.end());
    

    und es funktioniert unverändert mit list<>, und das auch noch ohne dass man sinnlos performance verbrät.

    BTW: ich habe noch nie ein beispiel mit resize() gesehen, immer nur erase().







  • pumuckl schrieb:

    std::vector hat eben als Voraussetzung, dass die Elemente default-kontruierbar sind.

    Wäre mir neu. Vielleicht haben das einige Funktionen wie resize() oder ein Konstruktor, aber man kann auch gut und sicher nicht-standardkonstruierbare Typen im std::vector verwenden.


Anmelden zum Antworten