std :: vectorbool garantiert, dass alle Einträge auf false gesetzt werden?

9

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.

    
Josh Brittain 10.04.2014, 09:15
quelle

4 Antworten

19

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

auf

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

definiert

void resize(size_type sz, bool c = false);

, so ist das Ergebnis dasselbe.

    
user657267 10.04.2014, 09:33
quelle
3

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

    
Basile Starynkevitch 10.04.2014 09:20
quelle
3

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 .

    
Baptiste Wicht 10.04.2014 09:19
quelle
-3

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     
Dr. Debasish Jana 10.04.2014 09:32
quelle

Tags und Links