2012-09-11 26 views
25

Estoy tratando de tomar en cuenta las dimensiones de una matriz 2D. Y luego use la entrada del usuario para completar esta matriz. La forma en que traté de hacer esto es a través de vectores (vectores de vectores). Pero he encontrado algunos errores cada vez que intento leer los datos y anexarlos a la matriz.Vector de vectores para crear la matriz

//cin>>CC; cin>>RR; already done 
vector<vector<int> > matrix; 
for(int i = 0; i<RR; i++) 
{ 
    for(int j = 0; j<CC; j++) 
    { 
    cout<<"Enter the number for Matrix 1"; 
     cin>>matrix[i][j]; 
    } 
} 

Cada vez que trato de hacer esto, me da un subíndice fuera de rango de error. ¿Algún consejo?

+3

no inicializó 'matriz'. – elyashiv

+0

@elyashiv en realidad, 'matriz' se inicializa. –

+1

@Luchian Grigore Los vectores están inicialmente vacíos. por lo tanto, el error fuera de rango. –

Respuesta

43

Como es, las dos dimensiones de su vector son 0.

En su lugar, inicializar el vector como esto:

vector<vector<int> > matrix(RR); 
for (int i = 0 ; i < RR ; i++) 
    matrix[i].resize(CC); 

esto le dará una matriz de dimensiones RR * CC con todos los elementos fijados a 0 .

+1

Puede crear un vector de tamaño 'RR' de vectores' CC' de tamaño en una sola declaración y evitar los cambios de tamaño. – juanchopanza

+0

@juanchopanza ¿estás hablando de std :: generate o simplemente asignación? –

5

no estoy familiarizado con C++, pero un rápido vistazo a la documentación sugiere que esto debería funcionar:

//cin>>CC; cin>>RR; already done 
vector<vector<int> > matrix; 
for(int i = 0; i<RR; i++) 
{ 
    vector<int> myvector; 
    for(int j = 0; j<CC; j++) 
    { 
     int tempVal = 0; 
     cout<<"Enter the number for Matrix 1"; 
     cin>>tempVal; 
     myvector.push_back(tempVal); 
    } 
    matrix.push_back(myvector); 
} 
+3

Correcto, pero esto adolece de penalizaciones de rendimiento debido a un retroceso posterior. –

+8

@LuchianGrigore: Leer una matriz de std :: cin mata su argumento sobre el rendimiento – stefan

90

debe inicializar el vector de vectores al tamaño adecuado antes de acceder a cualquier elemento. Puede hacerlo de esta manera:

// assumes using std::vector for brevity 
vector<vector<int>> matrix(RR, vector<int>(CC)); 

Esto crea un vector de tamaño RRCC vectores, lleno de 0.

+1

+1: Eso es lo que hago también. Sorprendido, eres el único que dio esta respuesta. Como un aparte, nunca usaría un vector de vectores para representar una matriz. =) – paddy

+1

@paddy Yo tampoco lo usaría. La idea de poder cambiar el tamaño arbitrariamente de cualquier columna o fila en cualquier momento, o cambiar las dimensiones de una matriz después de la creación, es demasiado aterradora para mí. – juanchopanza

+0

Es normal cambiar las dimensiones de una matriz (en MatLab lo haces todo el tiempo), pero en el uso real, la matriz es un bloque contiguo, y todo lo que estás cambiando son las filas/columnas (básicamente haciendo un seguimiento de la zancada -lengths) - para indexar un elemento en la matriz, se calcula el índice lineal a partir de su índice multidimensional. – paddy

1

prueba esto. m = fila, n = col

vector< vector<int> > matrix(m,vector<int>(n)); 

for(i=0;i<m;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
     cin>>matrix[i][j]; 
    } 
    cout<<endl; 
} 
cout<<"::matrix::"<<endl; 
for(i=0;i<m;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
     cout<<matrix[i][j]<<" "; 
    } 
    cout<<endl; 
} 
Cuestiones relacionadas