[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