Problema.
Completo desconocimiento de la librería estándar de plantillas (STL).
Solución.
Lee la documentación de la clase std::vector
.
Descripción del problema, paso a paso.
La clase std::vector
es un contenedor de la librería estándar de plantillas que permite almacenar datos de manera anexa en memoria y acceder a los elementos almacenados mediante el operador corchetes ([
y ]
), podría considerarse como una versión ampliada y segura del arreglo tradicional.
Constructor.
El std::vector
dispone de ocho constructores distintos de los que voy a mencionar sólo los tres más relevantes para esta pregunta:
vector()
Construye un vector vacío (delega en el constructor que recibe un
allocator
).
vector( size_type count, const T& value, const Allocator& alloc = Allocator());
Construye un vector con count
elementos todos ellos inicializados al valor value
, se usará el alojador alloc
para alojar los datos.
explicit vector( size_type count, const Allocator& alloc = Allocator() );
Construye un vector con count
elementos, todos los elementos serán alojados por el alojador alloc
y serán inicializados con el valor por defecto del tipo alojado.
El constructor que has usado en tu caso:
std::vector<int>Matriz(fila,columna);
Es el segundo, así que al contrario de lo que (parece que) crees, no estás creando una Matriz de Y fila
s por X columna
s si no un vector de fila
elementos inicializados al valor columna
Operador corchetes.
El operador corchetes de std::vector
(std::vector::operator []
) dispone de dos sobrecargas, una de sólo lectura y otra de lectura-escritura:
reference operator[]( size_type pos );
const_reference operator[]( size_type pos ) const;
Devuelve en cada caso una referencia al dato almacenado (std::vector::reference
o std::vector::const_reference
), en tu caso:
cin >> matriz[a][b];
Suponiendo que matriz
(con m minúscula) sea lo mismo1 que lo que Matriz
(con M mayúscula) que has declarado unas líneas atrás, al usar el primer operador corchete [a]
estás obteniendo una referencia al dato almacenado en matriz
, que viendo la declaración sabemos que es int
. Sobre el int
obtenido entonces usas otro operador corchetes [b]
y es ahí cuando obtienes el error que mencionas:
error: invalid types 'int[int]'
Ya que intentas indexar con corchetes un tipo no indexable (int
).
Propuesta.
Para conseguir lo que (parece que) quieres en el código que has mostrado, deberás usar un vector de vectores, para que sea más cómodo de usar te aconsejo definir un alias:
using Matriz = std::vector<std::vector<int>>;
Con ello, tu código podría quedar así:
int main () {
std::size_t fila=0u,columna=0u;
std::cout << "\t\t\t PROGRAMA DE MATRIZ EJ 1 C++\n\n";
std::cout << "Ingrese el valor de filas que quiere que tenga la matriz: ";
std::cin >> fila;
std::cout << "Ingrese el valor de columnas que quiere que tenga la matriz: ";
std::cin >> columna;
using Matriz = std::vector<std::vector<int>>;
// Utilizamos el segundo y tercer constructor de std::vector
Matriz matriz = { fila, std::vector<int>(columna) };
std::cout << "Ingrese el valor de los elementos de la matriz: \n";
for(int a = 0; a < fila ; a++)
{
for (int b = 0; b < columna ; a++)
std::cin >> matriz[a][b];
}
for(int a = 0; a < fila ; a++)
{
for (int b = 0; b < columna ; b++)
std::cout << matriz[a][b] << '\n';
}
return 0;
}
Date cuenta que he eliminado la línea using namespace std
, consulta esta pregunta para saber por qué. También he eliminado los std::endl
, consulta esta pregunta para saber por qué. También he cambiado el tipo de fila
y columna
a std::size_t
ya que es el tipo que esperan los constructores de std::vector
para las partes en que se usen tamaños y he eliminado las variables a
y b
que pueden (y deben) crearse en los bucles en que son usadas (no antes), respecto a los bucles, una posible mejora sería usar los bucles de rango (ya que trabajamos con contenedores):
std::cout << "Ingrese el valor de los elementos de la matriz: \n";
for(auto &fila : matriz)
{
for (auto &valor : fila)
std::cin >> valor;
}
for(auto &fila : matriz)
{
for (auto &valor : fila)
std::cout << valor << '\n';
}
1Sorpresa: No lo es. En C++ los nombres de identificadores son sensibles a mayúsculas/minúsculas.