2017-02-20 4 views
0

Wenn ich einen Konstruktor mit einer Initialisierungsliste als solche haben:Verständnis Vektor Initialisierung in C++

std::vector<int> _list; 

Program::Program() : _list(0) 
{ 
} 

Hat initialisieren diese alle Werte auf 0, auch wenn der Vektor ändert die Größe selbst?

+0

Ihre Frage ist schwer zu verstehen. Der Vektor, den Sie gepostet haben, hat keine Einträge - der Vektor wird einfach nicht von selbst angepasst. Sie müssen dazu eine der Funktionen des Vektors aufrufen, wie zum Beispiel 'push_back',' insert', 'emplace_back',' resize'. Wenn Sie diese Funktionen aufrufen, steuern Sie, was im Vektor platziert wird. – PaulMcKenzie

+4

Da der führende Unterstrich eine Konvention ist, die für die benutzerdefinierten Bezeichner der Implementierung im globalen Namespace verwendet wird, wird dies normalerweise für die eigenen Bezeichner vermieden. Eine allgemeine Konvention für Elementvariablen ist die in der Boost-Bibliothek verwendete, mit einem abschließenden Unterstrich. –

+0

Bitte klären Sie die Frage. –

Antwort

1

Sie scheinen das Argument des Vektorkonstruktors, den Sie aufrufen, falsch zu verstehen. _list(0) initialisiert _list mit der Länge Null, wobei der Standardwert für den Typ int verwendet wird, der ebenfalls Null ist, der aber irrelevant ist, wenn der Vektor keine Elemente enthält. Das Element Werte wird nicht explizit auf Null gesetzt. Vielleicht wollten Sie, dass der Konstruktor einen bestimmten Wert eine bestimmte Anzahl von Malen wiederholt? Wenn dies der Fall ist, müssen Sie die gewünschte Länge als erstes Argument übergeben und den Wert für das zweite Argument wiederholen. Diese Konstruktion wirkt sich nicht auf eine nachfolgende Größenänderung zur Erweiterung des Vektors aus, die die neuen Vektorelemente mit dem Standardwert füllen wird (oder einen anderen Wert, wenn Sie einen als zusätzliches Argument für vector::resize angeben).

Hier ist ein Beispiel zu veranschaulichen, basierend auf Ihren Code, der zuerst den Vektor mit dem Wert initialisiert 10 für Länge zu wiederholen 5, und passt die Größe dann den Vektor Länge 10.

#include <iostream> 
#include <vector> 

class Program 
{ 
public: 
    Program() : _list(0) { } 
    Program(unsigned long size, int value) : _list(size, value) { } 

    void ResizeList(unsigned long size) 
    { 
     _list.resize(size); 
    } 

    void PrintList() const 
    { 
     std::cout << "_list = "; 
     for (const auto& val : _list) 
     { 
      std::cout << val << ", "; 
     } 
     std::cout << std::endl; 
    } 

private: 
    std::vector<int> _list; 
}; 

int main() 
{ 
    Program p(5, 10); 
    p.PrintList(); 

    p.ResizeList(10); 
    p.PrintList(); 

    return 0; 
} 

Ausgang:

_list = 10, 10, 10, 10, 10, 
_list = 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 
+0

Sie müssen es also nicht wirklich initialisieren wenn du es nur als Liste verwendest, oder? Einfach push_back Artikel und du bist gut? – Koszuta

+0

Wenn Sie wollen, dass es leer anfängt, dann ist das genau richtig.Leer ist das Standardverhalten, wenn Sie keine andere Initialisierung angeben (was bedeutet, dass Sie es aus der Member-Initialisiererliste im Konstruktor der Klasse auslassen, die es besitzt), und Sie können dann die gewünschten Werte mit "push_back" hinzufügen. –

+0

Und wenn ich Größe auf einem Vektor verwende, sind die hinzugefügten Elemente 0? – Koszuta

0

Wenn Sie bei the documentation for the std::vector constructor anschauen, werden Sie für Konstruktor (3), dass die, die Sie verwenden, werden Sie sehen, dass Sie in _list0 Elemente vom Typ int an Ort und Stelle sind zu konstruieren. Dies bedeutet, dass Sie im Wesentlichen nichts tun.

Wenn der Vektor der Größe verändert wird, werden die Elemente, die Platz zugewiesen für wird nicht initialisiert werden, wenn Sie die resize Funktion zu verwenden, wobei in diesem Fall die Elemente auf ihren Standardwert oder einen Wert Ihrer Wahl initialisiert wird.

Zum Beispiel, wenn Ihr Vektor leer waren und Sie haben _list.resize(10); würde _list enthält nun 10 Elemente des Standard-konstruierten Typs von int, die 0 gerade sein sollte. Wenn Sie stattdessen etwas wie _list.resize(10, 5);, _list würden jetzt 10 5 s.

Ich hoffe, dass dies half, Dinge für Sie aufzuräumen. Wenn Sie weitere Fragen haben, zögern Sie nicht zu fragen.