[C++] Reordenar vector dinámico de objetos

Iniciado por Rockmore, 16 Marzo 2011, 19:34 PM

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

Rockmore

Saludos. Liado ando con un gestor de agenda, en el que he de reordenar por nombre los contactos cada vez que añado uno nuevo. Por supuesto, pensé en la burbuja, pero, a pesar de que compila sin problemas, no reordena nada. He aquí mi código:
Código (cpp) [Seleccionar]
//Clase Agenda
class Agenda{
private:
    Contacto *lista;
    int N;
public:
    //Constructor por defecto
    Agenda(){
        N=0;
        lista=NULL;
        return;
    }
    //Destructor
    ~Agenda(){
        if(lista){
            delete[]lista;
        }
    }
    //Metodo aniadir contacto
    void NuevoContacto(void){
        //Creacion vector Contacto auxiliar
        Contacto *aux=new Contacto[N+1];
        //Recoleccion de datos anteriores
        for(int i=0;i<N;i++){
            aux[i]=lista[i];
        }
        //Peticion de dato nuevo
        cin>>aux[N];
        cin>>aux[N].fnac;
        cin>>aux[N].dir;
        //Eliminacion de vector Contacto obsoleto
        if(lista!=NULL){
            delete[]lista;
        }
        //Recreacion de vector Contacto util
        lista=aux;
        N++;
        Ordenar(lista,N);
        return;
    }

//.........

    //Metodo reordenacion de contactos
    void Ordenar(Contacto listado[], int n){
        Contacto aux;
        bool centinela;
        for(int i=0;i<n&&centinela==true;i++){
            centinela=false;
            for(int j=0;j<n;j++){
                if(listado[j-1].VerNombre()>listado[j].VerNombre()){
                    aux=listado[j-1];
                    listado[j-1]=listado[j];
                    listado[j]=aux;
                    centinela=true;
                }
            }
        }
        return;
    }
};

¿Dónde está el fallo?

Akai

#1
Falta código para entender completamente lo que estás haciendo, pero básicamente creo que es esto:
Código (cpp) [Seleccionar]
listado[j-1].VerNombre()>listado[j].VerNombre()

No puedes comparar "nombres" de esa forma, C++ es potente, pero no hace magia. Puedes comparar enteros, floats, carácteres, booleanos entre sí, pero no tipos compuestos, estructuras, vectores, u objetos de una clase.

Para tu caso, las cadenas se comparan con strcmp. Si usas strings, lo puedes hacer con string.compare().

Opciones:
1)comparas utilizando la función o clase y método dichos arriba.

2) sobrecargas el operador > para tu clase Contacto para que realice la comparación de lo dicho en la opción 1 (si te ves con ánimo, para ampliar te irá bien) o implementarte tu propio método para comparar cadenas(Mejor no te compliques la vida, mira la opción 1).

Rockmore

Bueno, después de darle mil vueltas logré encontrar los dos fallos que había, como siempre, tonterías, pero que hacen que te vuelvas loco.
Para empezar, el símbolo > funciona, el tema es que el booleano centinela no estaba inicializado, por tanto, no entraba en el bucle de ordenación. Por otro lado, el bucle interno empezaba en j=0, cuando debía hacerlo en j=1. El código resultante del método es el siguiente.
Código (cpp) [Seleccionar]
//Metodo reordenacion de contactos
    void Ordenar(void){
        Contacto aux;
        bool centinela=true;
        for(int i=0;i<N&&centinela;i++){
            centinela=false;
            for(int j=1;j<N;j++){
                if(lista[j-1].VerNombre()>lista[j].VerNombre()){
                    aux=lista[j];
                    lista[j]=lista[j-1];
                    lista[j-1]=aux;
                    centinela=true;
                }
            }
        }
        return;
    }

De todos modos, gracias por el aporte. Lo tendré en cuenta para futuros programas, que se avecinan chungos.  ;)