2010-02-27 20 views
5

Estoy tratando de trabajar con vectores de vectores de ints para un solucionador de sudoku que estoy escribiendo.¿Cómo trabajo con vectores anidados en C++?

Pregunta 1:

Si voy a acceder a un vector de mi 2d por el índice, tengo que inicializarlo con el tamaño adecuado en primer lugar?

Por ejemplo:

typedef vector<vector<int> > array2d_t; 

void readAPuzzle(array2d_t grid) 
{ 
    for(int i = 0; i < 9; i++) 
     for(int j = 0; j < 9; j++) 
      cin >> grid[i][j]; 
    return; 
} 

int main() 
{ 
    array2d_t grid; 
    readAPuzzle(grid); 
} 

Will SEG culpa. Supongo que esto se debe a que está intentando acceder a los elementos de la grilla que aún no se han inicializado.

He intercambiado línea de declaración de rejilla con:

array2d_t grid(9, vector<int>(9, 0)); 

y esto parece deshacerse de este fallo seg. ¿Es esta la manera correcta de manejarlo?

Pregunta 2:

¿Por qué es que cuando trato de leer en mi rejilla de cin, y luego imprimir la red, la red está en blanco?

estoy usando el siguiente código para hacerlo:

void printGrid(array2d_t grid) 
{ 
    for (int i = 0; i < 9; i++) 
    { 
     for (int j = 0; j < 9; j++) 
     { 
      cout << grid[i][j] + " "; 
     } 
     cout << endl; 
    } 
} 

void readAPuzzle(array2d_t grid) 
{ 
    for(int i = 0; i < 9; i++) 
     for(int j = 0; j < 9; j++) 
      cin >> grid[i][j]; 

    return; 
} 

int main() 
{ 
    array2d_t grid(9, vector<int>(9, 0)); 
    printGrid(grid); 
    readAPuzzle(grid); 
    printGrid(grid); 
} 

Y yo intente ejecutar mi programa como:

./a.out < sudoku-test 

Dónde sudoku-prueba es un archivo que contiene lo siguiente:

3 0 0 0 0 0 0 0 0 
5 8 4 0 0 2 0 3 0 
0 6 0 8 3 0 0 7 5 
0 4 1 0 0 6 0 0 0 
7 9 0 0 2 0 0 5 1 
0 0 0 9 0 0 6 8 0 
9 3 0 0 1 5 0 4 0 
0 2 0 4 0 0 5 1 8 
0 0 0 0 0 0 0 0 6 

La primera llamada a printGrid() da una cuadrícula en blanco, cuando en cambio debería ver una grilla de 9x9 0's ya que así es como lo inicialicé. La segunda llamada debe contener la grilla de arriba. Sin embargo, las dos veces está en blanco.

¿Alguien puede arrojar algo de luz sobre esto?

+0

pago y envío si usted quiere manera más fácil tratar con datos multidimensionales dinámicos – Anycorn

Respuesta

5

Q1: Sí, esa es la forma correcta de manejarlo. Sin embargo, observe que los vectores anidados son una forma bastante ineficiente de implementar una matriz 2D. Un vector y los índices de cálculo por x + y * width suelen ser una mejor opción.

Q2A: El cálculo de grid[i][j] + " " no concatena dos cadenas (porque el lado izquierdo es int, no una cadena) sino que agrega el valor numérico a un puntero (la dirección de memoria del primer carácter de la cadena ""). Use cout << grid[i][j] << " " en su lugar.

Q2B: Está pasando la matriz por valor (se copia) para readAPuzzle. La función lee en su copia local, que se destruye cuando la función regresa. El paso por referencia en su lugar (esto evita hacer una copia y el original utiliza en su lugar): boost.multi_array

void readAPuzzle(array2d_t& grid) 
+0

@Tronic, ah ya veo. Pensé que el comportamiento predeterminado para los vectores sería pasar por referencia, como las matrices. – Salaban

+0

Esto no explica por qué el primer printGrid() no me da una grilla de 9x9 de 0 sin embargo?Si se copia, el cero aún debe estar presente cuando se imprime. – Salaban

+0

Las matrices son un extraño caso especial. No diría que las matrices se pasan por referencia, sino que cuando se escribe [], se obtiene un puntero (que luego se pasa por valor). Sin embargo, es una cuestión de perspectiva. – Tronic