std :: Vektorelemente initialisieren

8
%Vor%

Wie werden die Elemente dieser 3 Vektoren initialisiert?

Über Int, ich teste es und ich sah, dass alle Elemente 0 werden. Ist das Standard? Ich glaubte, dass Primitive undefiniert bleiben. Ich erstelle einen Vektor mit 300000000 Elementen, gebe Werte ungleich null, lösche sie und erzeuge sie neu, um OS-Speicher für Datensicherheit zu vermeiden. Elemente des neu erstellten Vektors waren ebenfalls 0.

Was ist mit Iterator? Gibt es einen Initialwert (0) für den Standardkonstruktor oder bleibt der Initialwert undefiniert? Wenn ich das überprüfe, zeigen Iteratoren auf 0, aber das kann OS

sein

Wenn ich ein spezielles Objekt zum Verfolgen von Konstruktoren erstelle, sah ich, dass Vektor für das erste Objekt den Standardkonstruktor und für alle anderen den Kopierkonstruktor ausführt. Ist das Standard?

Gibt es eine Möglichkeit, die Initialisierung von Elementen komplett zu vermeiden? Oder muss ich meinen eigenen Vektor erstellen? (Oh mein Gott, ich sage immer NICHT EINE WEITERE VECTOR UMSETZUNG) Ich frage, weil ich extrem riesige Sparse-Matrizen mit Parallelverarbeitung verwende, also kann ich push_back () nicht verwenden und natürlich will ich keine nutzlose Initialisierung, wenn ich später den Wert ändern werde.

    
Chameleon 05.06.2012, 22:33
quelle

4 Antworten

13

Sie verwenden diesen Konstruktor (für std::vector<> ):

%Vor%

Welche hat die folgende Dokumentation :

  

Repetitive sequence constructor: Initialisiert den Vektor mit seinem Inhalt auf eine Wiederholung, n mal, von Kopien von value .

Da Sie nicht value angeben, wird der Standardwert des Parameters T() verwendet, der in Ihrem Fall int ist, sodass alle Elemente 0 sein werden

    
Attila 05.06.2012, 22:39
quelle
5

Sie sind standardmäßig initialisiert.

  

Über Int, ich teste es und ich sah, dass alle Elemente 0 werden. Ist das Standard? Ich glaubte, dass Primitive undefiniert bleiben.

Nein, ein nicht initialisiertes int hat einen unbestimmten Wert. Diese sind standardmäßig initialisiert, d. H.

%Vor%     
Ed S. 05.06.2012 22:37
quelle
5

In C ++ 11 besagt die Spezifikation für den Konstruktor vector::vector(size_type n) , dass n -Elemente standardmäßig eingefügt werden. Dies wird als ein Element definiert, das durch den Ausdruck allocator_traits<Allocator>::construct(m, p) initialisiert wird (wobei m vom Zuordnertyp und p ein Zeiger auf den im Container gespeicherten Typ ist). Für den Standardzuordner ist dieser Ausdruck ::new (static_cast<void*>(p)) T() (siehe 20.6.8.2 ). Dieser Wert initialisiert jedes Element.

    
pmr 05.06.2012 22:46
quelle
3

Die Elemente eines Vektors sind standardmäßig initialisiert, was im Fall von POD-Typen Null initialisiert bedeutet. Es gibt keine Möglichkeit, es mit einem Standardvektor zu vermeiden.

    
Mark Ransom 05.06.2012 22:35
quelle

Tags und Links