2016-07-23 28 views
-6

Ich bin vertraut mit den STL-Vektoren. Allerdings würde ich gerne wissen, welche Konstruktor aufgerufen wird und was es tut, wenn ich einen Vektor wie auch die erste folgende:Std :: Vektor <int> vec [nx] [ny];

int nx=5; int ny=7; std::vector<int> myvec[nx][ny];

Update: ich den Code mit TDM-GCC 4.9.2 kompiliert aber anscheinend es muss mit „const int“ für einige andere Compiler initialisiert werden, so dass ich umschreiben es hier:

#include <iostream> 
#include <vector> 

using namespace std; 

int main(){ 
std::vector<int> myvec[7][9]; 
return 0; 
}; 

Dank.

+1

Ich hoffe, Sie erkennen, sind Sie ein 2D-Array von Vektoren (7x9) zu schaffen, kein 2D-Vektor. – rustyx

Antwort

4

Will 1 werden Konstruktor von here

In der Tat 63-mal genannt, weil Sie erstellen 63 std :: Vektoren, nicht ein 2D-Vektor.

Es wird kompiliert. Aber es sollte nicht. Du hast hier ein VLA. Es ist kein gültiger C++ - Code.

+2

Dieser Code ist völlig in Ordnung. Es wird ein 2d-Array von Zeile = 7 und Spalte = 9 des Typenvektors erstellt rj99999

+0

@ rj99999 das erste Codebeispiel ist ungültig C++. – juanchopanza

+0

Warum denken Sie, es ist nicht gültig C++? Sprechen Sie über Variable wurde für die Deklaration des Arrays verwendet? Sie meinen das, dann ist es tatsächlich compilerabhängig und der Code wird in vielen Compilern kompiliert. Versuchen Sie gcc – rj99999

2

Beachten Sie, dass die Variablen nx und const sein müssen, die als Arrays mit variabler Länge nicht als Standard-C++ qualifiziert sind.

Aber dann, wenn diese Variable const int verändern, dies wird einen 2D-Array mit 5 Reihen und 7 Spalten von default-initialisierten std::vector<int> Fällen, wie erklärt, dass jedes Element der 2D-Array ist zunächst ein leerer Vektor int Typen.

Während dies das tut, heißt das nicht, dass Sie jemals so etwas tun sollten - ein 2D C-artiges Array von std::vector Objekten ist ein seltsames Konstrukt. Wenn Sie eine feste Matrix wollen, wo jedes Element ein std::vector dann verwenden Sie die folgende (zum Beispiel) statt:

std::array<std::array<std::vector<int>, 7>, 5> mtx_vec; 
+0

Danke für die Antwort. – Eman