[Ayuda] Vectores

Iniciado por bemone, 23 Agosto 2013, 03:32 AM

0 Miembros y 1 Visitante están viendo este tema.

bemone

Buenas noches.
Tengo un gran problema que me esta trabando y rompiendo mucho las bolas.
Tengo varios vectores de char donde en varias posiciones las marco con una "X" y luego las comparo.
Si en la posicion del vector1 y en la misma posicion del vector2 hay una "X", marco el vector1 con una "A" y actualizo un contador.
Despues muestro todas las posiciones donde en el vector1 hay una "A" y no muestra nada.
El problema es que el contador me lo devuelve correcto (las coincidencias de posiciones en las que hay una "X" entre los dos vectores) pero el vector1 nunca es marcado con una A o una D.

Por ejemplo:



El codigo de la discordia:
Código (cpp) [Seleccionar]
int Cartones::compararCartones(Cartones ganador){
   int coincidencias = 0;
   vector<char> cartonGanador = ganador.getNumeros();
   for(int i=0; i<cartonGanador.size(); i++){
       if(cartonGanador[i] == 'X' && this->vsNumeros[i] == 'X'){
           this->vsNumeros[i] = 'A';
           coincidencias++;
       }
       else
           this->vsNumeros[i] = 'D';
   }
       return coincidencias;
}

Odio los tipos de variable de Windows.

amchacon

¿A quien te refieres con vector1? ¿Al vsNumeros?

Por cierto, unos consejos de eficiencia:

Código (cpp) [Seleccionar]
int Cartones::compararCartones(Cartones ganador){

No pases el objeto entero, su copia supone un desperdicio de memoria y de tiempo de ejecución. Pasa una referencia en su lugar, y ya de paso lo haces constante:

Código (cpp) [Seleccionar]
int Cartones::compararCartones(const Cartones &ganador){

Por otro lado:

Código (cpp) [Seleccionar]
vector<char> cartonGanador = ganador.getNumeros();

Copiar un vector supone gastar muchos recursos. No sé si es mejor que devuelvas un puntero/referencia al vector, aunque eso supondría un encapsulamiento más débil.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

bemone

#2
Cita de: amchacon en 23 Agosto 2013, 10:02 AM
¿A quien te refieres con vector1? ¿Al vsNumeros?

Por cierto, unos consejos de eficiencia:

Código (cpp) [Seleccionar]
int Cartones::compararCartones(Cartones ganador){

No pases el objeto entero, su copia supone un desperdicio de memoria y de tiempo de ejecución. Pasa una referencia en su lugar, y ya de paso lo haces constante:

Código (cpp) [Seleccionar]
int Cartones::compararCartones(const Cartones &ganador){

Por otro lado:

Código (cpp) [Seleccionar]
vector<char> cartonGanador = ganador.getNumeros();

Copiar un vector supone gastar muchos recursos. No sé si es mejor que devuelvas un puntero/referencia al vector, aunque eso supondría un encapsulamiento más débil.


Con vector1 me refiero a vsNumeros y con vector2 a cartonGanador.
Gracias por los consejos. ¿Sabes porque no puedo modificar vsNumeros?

En cuanto al vector lo puedo poner asi:
Código (cpp) [Seleccionar]
int Cartones::compararCartones(const Cartones &ganador){
    int coincidencias = 0;
    for(unsigned int i=0; i<ganador.getNumeros().size(); i++){
        if(ganador.getNumeros()[i] == 'X' && this->vsNumeros[i] == 'X'){
            this->vsNumeros[i] = 'A';
            coincidencias++;
        }
        else
            this->vsNumeros[i] = 'D';
    }
        return coincidencias;
}
Odio los tipos de variable de Windows.

amchacon

Cita de: bemone en 23 Agosto 2013, 16:01 PM
Con vector1 me refiero a vsNumeros y con vector2 a cartonGanador.
Pues el código es correcto, asi que el error debe estar en otra parte  :huh:

Los dos vectores tienen el mismo tamaño no?

Cita de: bemone en 23 Agosto 2013, 16:01 PMEn cuanto al vector lo puedo poner asi:
Código (cpp) [Seleccionar]
int Cartones::compararCartones(const Cartones &ganador){
    int coincidencias = 0;
    for(unsigned int i=0; i<ganador.getNumeros().size(); i++){
        if(ganador.getNumeros()[i] == 'X' && this->vsNumeros[i] == 'X'){
            this->vsNumeros[i] = 'A';
            coincidencias++;
        }
        else
            this->vsNumeros[i] = 'D';
    }
        return coincidencias;
}

Eso es peor, en cada iteración estas generando un vector nuevo *_*. Lo puedes dejar como estaba si eso, si es un vector de 10-20 números no supone tanta carga (lo malo sería si fuesen 1000 números xD).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

bemone

#4
Cita de: amchacon en 23 Agosto 2013, 17:04 PM
Pues el código es correcto, asi que el error debe estar en otra parte  :huh:

Los dos vectores tienen el mismo tamaño no?
Eso es peor, en cada iteración estas generando un vector nuevo *_*. Lo puedes dejar como estaba si eso, si es un vector de 10-20 números no supone tanta carga (lo malo sería si fuesen 1000 números xD).

Tienen exactamente el mismo tamaño (25). Lo que no entiendo es porque no se modifica el vector, en la condicion entra ya que el contador se actualiza.


------------------------------------------------------------------------------------------------

Solucionado: habia un problema en el orden en como llamaba los metodos.

:-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[ :-[

Gracias amchacon por tu buena onda!
Odio los tipos de variable de Windows.