[C con Clase] Problema para guardar matrices como vectores

victor Gonyi mrpiperoman en hotmail.com
Mar Mar 5 08:47:56 CET 2013


Buenos días.

Eso aclara mis dudas gracias. Solo 2 comentarios:

- No uso matrices porque no siempre van a ser tablas de 4x4 enteros. Serán de 4xN enteros dependiendo del caracter. La letra N sería de 5 de longitud por ejemplo.

- Sobre la creación del typedef discreteCharacter [4, N];  e ¿Hay alguna forma de definir un constructor, u operator para pasarle los datos por arrays? Mi principal problema era el evitar la notación tan larga como es:

myDecodedCharacter[0][0] = 1;myDecodedCharacter[0][1] = 1;

myDecodedCharacter[0][2] = 1;
myDecodedCharacter[0][3] = 0;

Si podía sustituirlo por otra más compacta, para hacerlo un poco más "amigable" al revisar el código. No obstante la solución que planteas también me sirve. 

Muchas gracias, un saludo.


Date: Mon, 4 Mar 2013 23:46:55 -0500
From: srd4121 en njit.edu
To: cconclase en listas.conclase.net
Subject: Re: [C con Clase] Problema para guardar matrices como vectores

Hola Víctor,
2013/3/4 victor Gonyi <mrpiperoman en hotmail.com>




Buenas noches.

Estoy intentando hacer una estructura de datos para guardar valores tipo int, que pueden ser 0, 1 o 2. Para ello, quiero usar un vector compuesto de vectores.



[CORTE]


Es decir, antes una entrada compuesta por 1 solo caracter: "A", "E", "~", debe devolver un vector de longitud X, que varía según el caracter introducido.

Mi falta de experiencia manejando vectores me hace complicado buscar la forma más correcta/elegante de hacer la función. De ahí mis preguntas:


- ¿Es correcto el planteamiento?

En principio, sí; aunque no estoy seguro de por qué has definido 'discreteCharacter' así:

typedef vector< vector<int> > discreteCharacter;


si luego no lo usas al implementar la función 'decodeCharacter()'. Escribes:

vector< vector<int> > BonusCoinsController::decodeCharacter( const char *decodeChar )

cuando podrías haber escrito:


discreteCharacter BonusCoinsController::decodeCharacter( const char *decodeChar )


- ¿Cuál es la mejor manera de crear el tipo discreteCharacter si a priori no sé cuanta longitud tiene el caracter introducido? Podría hacer 2 switch pero lo veo un poco engorroso, y no sé si es lo más correcto reservarlo dentro del switch y poner un return en cada uno.


Tal y como lo usas al principio, vas bien encaminado. No veo que necesites hacer 2 switch.

- ¿Cuál es la sintaxis correcta para que se pueda poner los valores de forma que "a ojo" se pueda ver que carácter es y facilitar su entendimiento? Es decir viendo:
myDecodedCharacter = (     (1,1,1,0),

                                              (1,2,0,0),
                                              (1,0,0,0),
                                              (1,1,1,0));

Si está bien tabulado, te puedes hacer a la idea que es realmente una E.


He probado con llaves, corchetes, operator= y me da errores de compilación continuamente, aun consultando la referencia: http://www.cplusplus.com/reference/vector/vector/vector/ 



Los paréntesis y comas son operadores en C++. Si quieres crear nuevos objetos de ciertos tipos, entonces tienes que indicar eso mismo al compilador. Esto sería,

discreteCharacter myDecodedCharacter( 4, vector<int>(4) );


myDecodedCharacter[0][0] = 1;myDecodedCharacter[0][1] = 1;

myDecodedCharacter[0][2] = 1;
myDecodedCharacter[0][3] = 0;

myDecodedCharacter[1][0] = 1;myDecodedCharacter[1][1] = 2;

myDecodedCharacter[1][2] = 0;
myDecodedCharacter[1][3] = 0;

y así sucesivamente.
Otra forma podría ser guardando todos los valores en una matriz (array de arrays) de enteros. Por ejemplo,

const int aDatos[4][4] = { {1,1,1,0},                                        {1,1,1,0},                                        {1,0,0,0},
                                        {1,1,1,0} };

y luego, hacer la asignación explícitamente para 'myDecodedCharacter':


myDecodedCharacter[0][0] = aDatos[0][0];
myDecodedCharacter[0][1] = aDatos[0][1];myDecodedCharacter[0][2] = aDatos[0][2];
myDecodedCharacter[0][3] = aDatos[0][3];...

También podríamos usar un bucle para automatizar hacer la copia. De todas maneras, me parece contraproducente hacer esto: si ya sabes que necesitas una matriz o tabla de 4x4 enteros, entonces deberías hacer eso mismo.

Ahora bien, si quieres que se vea los datos presentados debidamente, entonces escríbelos en comentarios. Por ejemplo,

//  ( 1,1,1,0 )
//  ( 1,2,0,0 )//  ( 1,0,0,0 )
//  ( 1,1,1,0 )

discreteCharacter myDecodedCharacter( 4, vector<int>(4) );


myDecodedCharacter[0][0] = 1;
myDecodedCharacter[0][1] = 1;
myDecodedCharacter[0][2] = 1;

myDecodedCharacter[0][3] = 0;...

Así se ve bien lo que uno quiere hacer y de lo que trata las siguiente sentencias.

Es un poco complicado para mí usar el vector de forma recursiva, así que cualquier ayuda/sugerencia es bienvenida.



No se trata de un 'vector' recursivo. Ten presente que 'vector' es una clase-plantilla. Es cierto que aparece el nombre 'vector' dos veces, pero se trata de clases MUY diferentes. Es decir, existe la clase 'vector<int>' y luego la otra clase 'vector< vector<int> >'. Si lo prefieres, míralas así:


typedef vector<int> fila;typedef vector<fila> matriz;
...matriz resultado( 4, vector<int>(4) );


Espero que esto te aclare las dudas.
Steven


_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130305/0c64c31e/attachment.html>


Más información sobre la lista de distribución Cconclase