2016-07-11 8 views
3

Warum ist es, dass ein Vektor mit deklarierten Größe Eingabe von cin wie so direkt annehmen kann:Warum müssen Vektoren, die ohne Größe deklariert wurden, push_back benötigen, um Eingaben mit cin zu akzeptieren?

int n; 
cin>>n; 
vector<int> a(n);//Vector declared with size 
for(int i=0;i<n;i++) 
    cin>>a[i]; 

Aber ein Vektor ohne Größe deklarierte braucht einen push_back() Funktionseingänge zu akzeptieren wie:

int n; 
cin>>n; 
vector<int> a;//Vector declared WITHOUT size 
int input; 
for(int i=0;i<n;i++){ 
    cin>>input; 
    a.push_back(input); 
} 

Antwort

3

Die Verwendung des [] Operators auf einem Vektor geht davon aus, dass das Objekt in dem gegebenen Index gültig ist. Wenn Ihr vector seinen internen Puffer nicht diesem Index zugeordnet hat, ist dies ein undefiniertes Verhalten. Alternativ hängt die push_back() einfach an das Ende der vector an und weist einen größeren internen Puffer zu, falls einer benötigt wird, so dass sie niemals undefiniertes Verhalten auf die gleiche Weise ausführt. Durch explizites Ändern der Größe Ihres Vektors vor dem Zugriff darauf mit [] wird die Größe des Arrays so geändert, dass der Zugriff auf die Elemente bis n-1 definiert ist, aber alles andere als n-1 ist ein undefiniertes Verhalten.

1

Sein, weil

vector<int> a(n); 

Pre-ordnet Ihren Vektor mit n Elemente s wie erwähnt here (see constructor variant (2) please), während

vector<int> a; 

nicht der Fall, und Sie haben die Elemente einzeln hinzuzufügen.


Wenn Sie die operator[] mit einem std::vector verwenden, muss sichergestellt werden, dass ein Element bei dem verwendeten Index vorhanden ist, das heißt sollte der Index als std::vector<T>::size() weniger sein.

1

Im ersten Beispiel Code Ihre Verwendung Vektor Konstruktor Platz für N-Elemente reservieren, und Sie können Random-Access-Operator verwenden. Der Operator für den wahlfreien Zugriff überprüft nicht die Größe des Speichers.

Im zweiten Code erstellen Sie leeren Vektor. push_back wird für einen zusätzlichen Schritt der Speicherzuweisung für ein Objekt int benötigt.

CPP Referenz mit Konstruktorfunktionen: http://en.cppreference.com/w/cpp/container/vector/vector Blick in (3)

1

Grund ist ganz einfach: Wenn Sie eine Größe deklarieren (sagen wir k), ordnen Sie k Elemente zu. hinter der Szene ist ein T * vec = new T [k]; Aufruf irgendeiner Art, sobald Sie jedes der k Elemente existieren und nicht nur das, sondern mit Standardwert.

wenn wir sowas wie std :: vector v; es ist Größe ist 0, nichts wurde zugeteilt, also müssen wir die Spots entweder über push_back oder emplace_back erstellen (was besser ist, da Sie keinen Kopierkonstruktor verwenden, sondern direkt erstellen), wenn Sie vor einer Aktion v [0] sagen Zugriff auf Adresse, die nicht vorhanden ist, während in der vorherigen Scerino es ist

1

Da ersten Vektor, Speicher vorab zugewiesen haben und dann können Sie auf bestimmte Element durch Operator [] verweisen.

Wenn Sie den Operator auf dem zweiten Vektor verwenden würden, bevor Sie einige Elemente verschieben, wäre das Verhalten undefiniert.

+1

Nein, Vektoren werfen keine Ausnahmen auf 'op []'. –

+0

Mein schlechter, fester (: – stryku

Verwandte Themen