[C con Clase] Problema para guardar matrices como vectores
Davidson, Steven
srd4121 en njit.edu
Mar Mar 5 05:46:55 CET 2013
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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130304/c998821a/attachment.html>
Más información sobre la lista de distribución Cconclase