PDA

Visualizza la versione completa : Sort(Vector) c++


lucadivi
17-07-2012, 20:50
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.

shodan
17-07-2012, 23:02
Intnato ti conviene passare i parametri per const reference visto che non li modifichi.


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:


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.

lucadivi
18-07-2012, 08:44
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 =) :sadico: :sadico: :sadico:

Loading