Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Sort(Vector) c++

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    10

    Sort(Vector) c++

    Salve ragazzi spiego subito il mio problema. Ho una classe Persona con variabili membro Nome e Cognome. Ho una classe InterfacciaPersonale che ha come variabile membro un vector di puntatori a Persona:

    vector<Persona*> VP;

    il gestore deve permettere l'inserimento ordinato secondo il cognome. Ho ridefinito l'operatore < in classe Persona. Avevo pensato quindi di utilizzare VP.push_back(*Persona PERSONA) e poi utilizzare la funzione sort.Come posso fare?

    FILE CHE GESTISCE I COMPUTER:

    InterfacciaPersonale::InterfacciaPersonale() {}
    /************************************************** ********/
    void InterfacciaPersonale::inserisci(Persona* PERSONA){
    VP.push_back(PERSONA);
    sort(VP.begin(),VP.end());
    }
    /************************************************** ********/

    RIDEFINIZIONE DELL'OPERATORE < NELLA CLASSE PERSONA

    /************************************************** ********/
    bool operator<(Persona &P1,Persona &P2){return P1.get_Cognome()<P2.get_Cognome();}
    /************************************************** ********/

    se uso sort come scritto l'errore non è di compilazione, è solo che non ho capito ancora sotto quale criterio effettua l'ordinamento xD.

    Gli input sono (Manager e Programmatore sono sottoclassi di Persona):

    /************************************************** ********/
    InterfacciaPersonale ip;
    Manager* m1=new Manager("John", "Reds", pa);
    ip.inserisci(m1);
    Programmatore* p1=new Programmatore("Paolo", "Bianchi");
    p1->setComponente(pa->myCompVector[0]);
    ip.inserisci(p1);
    Programmatore* p2=new Programmatore("Luca", "Verde");
    p2->setComponente(pa->myCompVector[1]);
    ip.inserisci(p2);
    Programmatore* p3=new Programmatore("Gino", "Magenta");
    p3->setComponente(pa->myCompVector[2]);
    ip.inserisci(p3);
    Manager* m2=new Manager("Mark", "Pink", pb);
    ip.inserisci(m2);
    Programmatore* p4=new Programmatore("Salvo", "Gialli");
    p4->setComponente(pb->myCompVector[0]);
    ip.inserisci(p4);
    Programmatore* p5=new Programmatore("Mario", "Blu");
    p5->setComponente(pb->myCompVector[1]);
    ip.inserisci(p5);
    ip.stampa();
    /************************************************** ********/

    L'output è:
    /************************************************** ********/

    RUOLO: PROGRAMMATORE
    NOME: Paolo
    COGNOME: Bianchi
    RUOLO: PROGRAMMATORE
    NOME: Luca
    COGNOME: Verde
    RUOLO: PROGRAMMATORE
    NOME: Salvo
    COGNOME: Gialli
    RUOLO: PROGRAMMATORE
    NOME: Gino
    COGNOME: Magenta
    RUOLO: MANAGER
    NOME: Mark
    COGNOME: Pink
    RUOLO: PROGRAMMATORE
    NOME: Mario
    COGNOME: Blu
    RUOLO: MANAGER
    NOME: John
    COGNOME: Reds

    /************************************************** ********/

    Come vedete è un mix tra sort per cognome e inserimento in testa xD.Sono nuovo e spero di avere una risposta dai più gentili visto che il programma funziona tutto ma ha questo piccolo problemino ed è un vero peccato consegnarlo errato.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Intnato ti conviene passare i parametri per const reference visto che non li modifichi.
    codice:
    bool operator<(const Persona &P1, const Persona &P2){ return P1.get_Cognome()<P2.get_Cognome();}
    Poi stai lavorando con puntatori, non con oggetti, per cui la tua funzione non verrà mai invocata (gli overload funzionano solo con oggetti, non con i puntatori).

    Infine stai usando la versione sbagliata di std::sort().
    La versione corretta è il secondo overload di quella funzione:
    http://www.cplusplus.com/reference/algorithm/sort/
    che prende in ingresso un predicato.

    Ora non hai specificato che compilatore usi.
    Se compatibile C++11 puoi usare una lambda function:
    codice:
    sort(VP.begin(),VP.end(), [] (const Persona* a, const Persona* b) -> bool { 
        return *a < * b; 
    } );
    Altrimenti usi un function objects o un puntatore a funzione come indicato nel link.
    L'importante è ricordare che i parametri passati sono dei Persona*

    E comunque preferibile usare un vector di shared_ptr invece che di puntatori raw. Si evitano memory leaks se non li deallochi alla fine.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    10
    Grazie mille sei stato d'aiuto in modo pazzesco non ho cambiato nulla eccetto la definizione e implementazione di questa funzione

    bool function(Persona* a,Persona* b){
    return a->get_Cognome()<b->get_Cognome();
    }

    e utilizzando

    sort(VP.begin(),VP.end(),function);

    Ora il programma è finito =)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.