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?
-
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.
DefiniereSTD_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.
DefiniereSTD_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.