Contenedores / C++17

Matrices y grillas

Llevar al apunte ↗

Descripción

Una matriz organiza datos por fila y columna. vector<vector<int>> permite crear tantas filas y columnas como indique la entrada. Para un tablero de caracteres también sirve vector<string>, donde cada string es una fila.

Usalas cuando importa la posición de cada dato en dos dimensiones, como una imagen, un tablero o una tabla de valores. En a[fila][columna], el primer índice selecciona una fila y el segundo una posición dentro de esa fila.

Las filas de un vector de vectores pueden tener tamaños diferentes. Los ejemplos crean una grilla rectangular de n filas y m columnas. Antes de consultar vecinos, comprobá los dos índices. Usá tipos con signo para poder representar desplazamientos como -1.

Funciones y operaciones

Uso Resultado o efecto
vector<vector<int>> a(n, vector<int>(m, 0)) Crea n filas de m ceros
a[f][c] Acceso al dato de fila f y columna c
a.size() Cantidad de filas
a[f].size() Cantidad de columnas de esa fila
vector<string> g(n) Crea n strings para cargar las filas de un tablero
0 <= f && f < n && 0 <= c && c < m Comprueba que una casilla rectangular exista

Ejemplos

Crear y cargar números

int n, m;
cin >> n >> m;
vector<vector<int>> a(n, vector<int>(m, 0));
for (int f = 0; f < n; ++f) {
    for (int c = 0; c < m; ++c) {
        cin >> a[f][c];
    }
}

Cargar filas de caracteres

int n, m;
cin >> n >> m;
vector<string> grilla(n);
for (int f = 0; f < n; ++f) cin >> grilla[f];
// El enunciado debe garantizar m caracteres por fila.

Consultar los cuatro vecinos

vector<string> grilla = {"...", ".#.", "..."};
int n = 3, m = 3;
int fila = 1, columna = 1;
int df[] = {-1, 1, 0, 0};
int dc[] = {0, 0, -1, 1};
int libres = 0;
for (int d = 0; d < 4; ++d) {
    int f = fila + df[d];
    int c = columna + dc[d];
    if (f >= 0 && f < n && c >= 0 && c < m && grilla[f][c] == '.') {
        ++libres;
    }
}
// libres vale 4

Una matriz de enteros de 32 bits usa aproximadamente 4 * n * m bytes para sus datos. Calculá el producto con un tipo amplio antes de decidir el tamaño.