2014-09-19 9 views
6

Sto tentando di aggiungere valori a un vettore 2D utilizzando entrambi gli indici. Quando eseguo il mio programma, ricevo il messaggio di Windows che dice che il programma ha smesso di funzionare. L'uso di Dev-C++ per il debug ha mostrato che c'era un errore di segmentazione (non sono sicuro di cosa significhi). Per favore non suggerire l'uso di array, devo usare i vettori per questo compito.Assegnazione di valori al vettore 2D utilizzando gli indici

#include <iostream> 
#include <vector> 
using namespace std; 

int main(int argc, char** argv) { 

vector< vector<int> > matrix; 
cout << "Filling matrix with test numbers."; 
for (int i = 0; i < 4; i++) { 
    for (int j = 0; j < 4; j++) { 

     matrix[i][j] = 5; // causes program to stop working 

    } 
} 
} 

Ho creato un banco di prova dove voglio riempire una matrice 3x3 con il valore 5. Ho il sospetto che ha qualcosa a che fare con la dimensione del vettore 2D non essere definito in modo specifico. Come potrei riempire un vettore 2D con valori usando gli indici?

risposta

9

Come scritto, questo è problematico, stai provando a scrivere su un vettore per il quale non hai ancora assegnato memoria.

Opzione 1 - Ridimensionare i vettori prima del tempo

vector< vector<int> > matrix; 
cout << "Filling matrix with test numbers."; 
matrix.resize(4); // resize top level vector 
for (int i = 0; i < 4; i++) 
{ 
    matrix[i].resize(4); // resize each of the contained vectors 
    for (int j = 0; j < 4; j++) 
    { 
     matrix[i][j] = 5; 
    } 
} 

Opzione 2 - Dimensione vostro vettore quando si dichiara

vector<vector<int>> matrix(4, vector<int>(4)); 

Opzione 3 - Utilizzare push_back per ridimensionare il vettore, se necessario.

vector< vector<int> > matrix; 
cout << "Filling matrix with test numbers."; 
for (int i = 0; i < 4; i++) 
{ 
    vector<int> temp; 
    for (int j = 0; j < 4; j++) 
    { 
     temp.push_back(5); 
    } 
    matrix.push_back(temp); 
} 
+0

Perché è necessario avere matrice [i] .resize (4) all'interno del ciclo for? – AvP

+0

Perché hai un vettore di vettori. Quindi ciascuno dei vettori interni ha bisogno di una dimensione di 4, quindi il vettore esterno contiene 4 di questi vettori interni. – CoryKramer

+0

Per il mio caso, voglio che questo vettore 2D rappresenti una matrice 3x3. Quindi non dovrebbe essere matrix [i] .resize (3), e il vettore esterno ne conterrebbe 3? – AvP

3

Non è stato assegnato spazio per il vettore 2D. Quindi, nel tuo codice corrente, stai tentando di accedere ad una memoria che non appartiene allo spazio di memoria del tuo programma. Ciò provocherà un errore di segmentazione.

prova:

vector<vector<int> > matrix(4, vector<int>(4)); 

Se si vuole dare tutti gli elementi lo stesso valore, si può provare:

vector<vector<int> > matrix(4, vector<int>(4,5)); // all values are now 5 
0
vector<int> v2d1(3, 7); 
    vector<vector<int> > v2d2(4, v2d1); 
    for (int i = 0; i < v2d2.size(); i++) { 
     for(int j=0; j <v2d2[i].size(); j++) { 
        cout<<v2d2[i][j]<<" "; 
       } 
       cout << endl; 
      } 
+0

Ciao Mohammad, benvenuto nello stackoverflow. per favore aggiungi l'idea principale e i cambiamenti della tua risposta, e non solo il codice. –