Welche Typen darf man in std::vector speichern?



  • Hallo,

    Was sind die Voraussetzungen für den Typ T bei std::vector<T>? Gibt es da irgendwo ein Übersicht, wo alle Container aufgelistet sind(C++11) ?



  • Das gibt es nicht. Die Voraussetzungen sind für individuelle Operationen definiert. Siehe die Tabellen bei 23.1 und 23.2.3.



  • Danke, das ist auch gut.



  • Es muss immer ein Default/Kopierkonstruktor und/optional(?) Zuweisungsoperator existieren, oder? Denn ein std::vector kann keine Referenzen als Typ haben und so bei push_back/push_front, usw. ja nur Kopien erzeugen?



  • Hacker schrieb:

    Es muss immer ein Default/Kopierkonstruktor und/optional(?) Zuweisungsoperator existieren, oder?

    Nein. Wie gesagt, guck dir die Operationen an.



  • Nur vor std::vector<bool> muss gewarnt werden. Haben die das in C++11 endlich korrigiert?


  • Mod

    knivil schrieb:

    Nur vor std::vector<bool> muss gewarnt werden. Haben die das in C++11 endlich korrigiert?

    Nope. Nicht einmal deprecated.



  • SeppJ schrieb:

    knivil schrieb:

    Nur vor std::vector<bool> muss gewarnt werden. Haben die das in C++11 endlich korrigiert?

    Nope. Nicht einmal deprecated.

    Wieso, was ist daran schlimm? Wieso sollte davor gewarnt werden? Was ist dann die entsprechend gute Alternative?



  • std::vector<bool> ist zuallererst so spezifiziert (template spezifikation), dass jedes bool einen Bit an Speicher belegt.
    Laut dem Stadard ist std::vector<bool> kein Container:

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2160.html

    Lies nochmal das, vielleicht hilft es weiter.
    Denn: In einem std::vector<bool> ist ein einzelnes Element z.B. nicht addressierbar.
    Definiere STD_VECTOR_BOOL_NOT_SPECIAL , dann wird die spezialisierung weggenommen.



  • Hacker schrieb:

    std::vector<bool> ist zuallererst so spezifiziert (template spezifikation), dass jedes bool einen Bit an Speicher belegt.
    Laut dem Stadard ist std::vector<bool> kein Container:

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2160.html

    Lies nochmal das, vielleicht hilft es weiter.
    Denn: In einem std::vector<bool> ist ein einzelnes Element z.B. nicht addressierbar.
    Definiere STD_VECTOR_BOOL_NOT_SPECIAL , dann wird die spezialisierung weggenommen.

    Ah, ok danke, wusste ich noch nicht. Und hier nochmal kurz die Richtlinien:

    Guidance for users with existing code using the vector<bool> specialization:
    - If you don't care about vector<bool>'s special features, do nothing. Code that does not expect vector<bool> to have special characteristics will continue to work without change.
    - If you do want the vector<bool> specialization, define STD_VECTOR_BOOL_SPECIAL. Plan to eventually switch to std::dynamic_bitset since it isn't good practice to depend on removed features.
    - If you do not want the vector<bool> specialization, define STD_VECTOR_BOOL_NOT_SPECIAL.

    Guidance for users writing new code:
    - If you need a container with iterators and don't care about space optimizations or bit twiddling functions, use vector<bool>. Define STD_VECTOR_BOOL_NOT_SPECIAL if you want to be sure you don't get the old specialization.
    - If you don't need a container with iterators, care about space, or need bit twiddling functions, use std::dynamic_bitset.



  • Gugelmoser schrieb:

    Und hier nochmal kurz dir Richtlinien:

    ? Meintest 'die', richtig?



  • Hacker schrieb:

    ? Meintest 'die', richtig?

    oh mann...



  • langweilig? schrieb:

    Hacker schrieb:

    ? Meintest 'die', richtig?

    oh mann...

    Ups, ja natürlich, das sollte nicht "dir" heißen. 😉


Anmelden zum Antworten