PDA

Visualizza la versione completa : [c++]sort di un array di classi


giuseppe500
06-07-2009, 18:25
ciao.
Come posso fare il sort nella programmazione generica , con i function object di un insieme di oggetti di classe CClasse1 per la variabile membro CClasse.campoDaSortare?
ad es questa la classe CClasse1:

class CClasse1
{
double campoDaSortare;
int CampoA;
int CampoB;
int CampoC;
};

vector<CClasse1*> vect;

CClasse1* pobj = new CClasse1 ();
pobj->campoDaSortare = 99 ;
pobj->CampoA = 22;
pobj->CampoB = 33;

vect.push_back(pobj);

pobj = new CClasse1 ();
pobj->campoDaSortare = 1 ;
pobj->CampoA = 11;
pobj->CampoB = 55;

vect.push_back(obj);

all inizio
99 22 33
1 11 55

vorrei dopo il sort
1 11 55
99 22 33

grazie.

Mad_al
06-07-2009, 18:55
relativamente a questo caso, basta fare un passaggio diretto tramite variabile temporanea di appoggio e cquindi scambiare i 2 oggetti.

nel caso generico, allora dipende in base a cosa devi ordinarli... devi scegliere uni dei campi.

se si tratta di "CampoDaSortare" allora basta fare 2 cicli for annidati con due indici diversi i e j, (n.b. il secondo for deve partire da j=i+1)

e mettere una condizione di if che controlli il "CampoDaSortare"... e a seconda della condizione ligica, far partire lo scabio con una variabile temporanea di appoggio per l'oggetto del vettore.

shodan
06-07-2009, 19:36
O basta usare la seconda versione di sort:
http://www.cplusplus.com/reference/algorithm/sort/

Ad esempio:



inline bool cmp(const CClasse1* a, const CClasse1* b) {

if (a == 0 || b==0) {
throw std::runtime_error("null pointer");
}

return ( a->campoDaSortare < b->campoDaSortare );

}

...
try {
sort (vect.begin(),vect.end(),cmp);
} catch (const std::exception& e) {
cout << e.what() << endl;
}

Loading