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
seinWenn 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.
Sie verwenden diesen Konstruktor (für std::vector<>
):
Welche hat die folgende Dokumentation :
Repetitive sequence constructor: Initialisiert den Vektor mit seinem Inhalt auf eine Wiederholung,
n
mal, von Kopien vonvalue
.
Da Sie nicht value
angeben, wird der Standardwert des Parameters T()
verwendet, der in Ihrem Fall int
ist, sodass alle Elemente 0 sein werden
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.
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.
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.