2016-04-22 27 views
0

Ich möchte die Eingabe vom Benutzer für eine 2D-Matrix durch 2D-Vektor nehmen. Aber während ich unten stehe, ist das Programm abgestürzt !!! Aber warum?Initialisierung 2D Vektor in C++

int m, n; 
cin>>m>>n; 

vector<vector<int> > v; 

for(int i=0; i<m; i++) 
{ 
    for(int j=0; j<n; j++) 
    { 
     int a; 
     cin>>a; 
     v[i].push_back(a); 
    } 
} 

Was wird die Lösung nach meinem Code sein.

Antwort

5

An dem Punkt, wo v[i].push_back(a); innerhalb der for Schleife genannt wird, Vektor v leer ist, und unter Verwendung von v[i] zu undefiniertem Verhalten führen.

Der Code sollte zuerst push_back ein vector<int>:

for (int i=0; i<m; i++) 
{ 
    v.push_back(vector<int>()); 
    for (int j=0; j<n; j++) 
    { 
     int a; 
     cin >> a; 
     v[i].push_back(a); 
    } 
} 

Eine Alternative wäre, Vektor zu initialisieren v explizit Größe m:

int m, n; 
cin>>m>>n; 
vector<vector<int> > v(m); 

for(int i=0; i<m; i++) 
{ 
    for(int j=0; j<n; j++) 
    { 
     int a; 
     cin>>a; 
     v[i].push_back(a); 
    } 
} 
+0

Es funktioniert. Kannst du mir bitte Details und warum ich push_back einen Vektor ?? –

+0

@NafeeurRahman Weil du nichts in 'v' gedrückt hast und es leer ist. 'v' ist ein 2-d-Vektor. – songyuanyao

+1

@NafeeurRahman Wenn der Vektor 'v' leer ist, versucht der Zugriff auf' v [i] 'für ein beliebiges' i' auf Speicher außerhalb des zugewiesenen Speichers (falls vorhanden) für Elemente von 'v' zuzugreifen, was ein undefiniertes Verhalten ist. Für eine Analogie ist dies ähnlich dem Fall, in dem Sie "int v [10];" haben und versuchen, auf 'v [99]' zuzugreifen. – jotik

4

Da Sie die Größe Ihrer Matrix weiß nur, v die Größe Bevor Sie es füllen:

vector<vector<int> > v(m); 
for(int i=0; i<m; i++) 
{ 
    v[i].resize(n); 
    for(int j=0; j<n; j++) 
    { 
     cin >> v[i][j]; 
    } 
} 
-1

v [i] wurde nicht gebaut, wenn Sie v nennen [i] .push_back(), müssen Sie gerade v first.it der init einfach:

vector<vector<int>> v; 
v.reserve(m); 
for(...) 
... 
+0

Nein, 'reserve' löst das Problem nicht,' v' ist noch leer ... – songyuanyao