[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