Ich möchte, dass alle Einträge in meinem std :: Vektor falsch sind, nachdem ich die Größe auf die gewünschte Containergröße geändert habe. Dies scheint beim Testen der Fall zu sein, aber ich kann keine Dokumentation finden, die dies immer garantiert.
Mir ist klar, dass ich alles selbst auf false setzen könnte, aber das scheint ineffizient zu sein, wenn es bereits für jeden Eintrag auf false gesetzt ist (es ist ein Vektor von anständiger Größe und wird in Tausenden von Orten erstellt).
Gibt es dafür eine Garantie? Vielen Dank im Voraus.
resize
wird default-Elemente einfügen, wobei der (C ++ 11) -Standard dies aufruft:
allocator_traits<bool>::construct(m, p)
Dabei ist m
ein Zuordner und p
auf die Zieladresse.
Dies wiederum (unter der Annahme, dass m
ein Standardzuordner ist) ruft
m.construct(p)
ruft wiederum
auf ::new((void *)p) bool()
Also wird Ihre bool
mit Wert initialisiert, was für bool
s eine Null-Initialisierung bedeutet, was false
bedeutet.
Wenn m
ein benutzerdefinierter Zuordner ist und aus irgendeinem Grund construct()
fehlt, wird es immer noch value-initialisiert.
Wie bereits erwähnt, verwendet std::vector<bool>
nicht den Standard-Allocator, trotzdem ist resize()
als
void resize(size_type sz, bool c = false);
, so ist das Ergebnis dasselbe.
Ja, ein std::vector<bool>
wird mit nullten Bytes initialisiert, die false
(der Standardwert für initialisierte bool
-s) auf den meisten Maschinen sind.
Siehe den Hinweis zu std :: vector
Meiner Meinung nach, wenn Sie verwenden:
%Vor% Jeder Eintrag sollte auf false
gesetzt werden. Brauchst du das nicht?
Wenn Sie außerdem false
nicht angeben, wird der Standardwert verwendet, also false
für bool
.
Nicht garantiert. Besser wäre es,
zu haben %Vor%Und lassen Sie Ihren Vektor wie folgt deklarieren:
%Vor%Wenn Sie auf ein Element in Vektor zugreifen, sagen wir v [2], ist es garantiert falsch, es sei denn, Sie tun etwas wie unten:
%Vor%vor dem Zugriff auf v [2]
oder v.push_back (true);
verwenden