allora scusate la pigrizia , penso di avere risolto in parte il problema , cosi:
codice:
classe elemento da ordinare
class CProva
{
public:
CProva(void);
~CProva(void);
int x;
int y;
int z;
int id;
};
inline int cmp ( CProva& a, CProva& b)
{
if( a.x == b.x && a.y == b.y && a.z < b.z)
return 1;
if( a.x == b.x && a.y < b.y)
return 1;
if( a.x < b.x )
return 1;
return 0;
}
.
.
.
vector<CProva>Vect;
CProva p;
CProva p1;
CProva p2;
CProva p3;
p.x = 55;
p1.x = 33;
p2.x = 22;
p3.x = 11;
p.y = 77;
p1.y = 44;
p2.y = 24;
p3.y = 22;
p.z = 88;
p1.z = 40;
p2.z = 20;
p3.z = 10;
p.id = 110;
p1.id = 150;
p2.id = 230;
p3.id = 10;
Vect.push_back(p);
Vect.push_back(p1);
Vect.push_back(p2);
Vect.push_back(p3);
std::sort(Vect.begin(),Vect.end(),cmp);
for(vector<CProva>::iterator i = Vect.begin(); i != Vect.end(); ++i)
printf("X: %i\n Y:%i\n Z: %i\n ID: %i\n", (*i).x,(*i).y,(*i).z,(*i).id);
char* c = new char[1];
int n = p1.id;
scanf(c);
}
in effetti ho provato e ordina per le tre componenti
parzialmente perchè:
è un problema che ho da quando uso l'stl , è spiegato ben chiaro nei libro che ho letto (effective stl) che gli oggetti all'interno dei container sono copie , cosi' ho usato dei puntatori , nella speranza di poter modificare "fuori" da dentro i container e gli operatori di confronto i valori degli oggetti , quindi ho fatto cosi:
[code]
codice:
inline int cmp ( CProva* a, CProva* b)
{
if( (*a).x == (*b).x && (*a).y == (*b).y && (*a).z < (*b).z)
return 1;
if( (*a).x == (*b).x && (*a).y < (*b).y)
return 1;
if( (*a).x < (*b).x )
return 1;
return 0;
}
inline int cmpId ( CProva* a, CProva* b)
{
if( (*a).id < (*b).id )
{
int nSwap = (*a).id;
(*a).id = (*b).id ;
(*b).id = nSwap;
return 1;
}
return 0;
}
vector<CProva*>Vect;
CProva p;
CProva p1;
CProva p2;
CProva p3;
p.x = 55;
p1.x = 33;
p2.x = 22;
p3.x = 11;
p.y = 77;
p1.y = 44;
p2.y = 24;
p3.y = 22;
p.z = 88;
p1.z = 40;
p2.z = 20;
p3.z = 10;
p.id = 110;
p1.id = 150;
p2.id = 230;
p3.id = 10;
Vect.push_back(&p);
Vect.push_back(&p1);
Vect.push_back(&p2);
Vect.push_back(&p3);
std::sort(Vect.begin(),Vect.end(),cmp);
std::sort(Vect.begin(),Vect.end(),cmpId);
for(vector<CProva*>::iterator i = Vect.begin(); i != Vect.end(); ++i)
printf("X: %i\n Y:%i\n Z: %i\n ID: %i\n", (*i)->x, (*i)->y, (*i)->z, (*i)->id);
char* c = new char[1];
int n = p3.id;// questo rimane uguale , non viene modificato!!!!!!
questa è la funzione incriminata , con questa vorrei andare a modificare gli oggetti :
codice:
inline int cmpId ( CProva* a, CProva* b)
{
if( (*a).id < (*b).id )
{
int nSwap = (*a).id;
(*a).id = (*b).id ;
(*b).id = nSwap;
return 1;
}
return 0;
}
ma mi becco un bell' errore penso perchè sto modificando i valori del ciclo mentre itero e poi comunque ho scritto cosi' ma non mi è ben chiaro se effettivamente il ragionamento dello swap è corretto.
ciao.
ho detto qualche castroneria?
come posso modificare gli oggetti p,p1,p2 e p3?
grazie.
ps.il programma deve rinumerare gli id degli oggetti della classe cprova in base a un ordinamento.
grazie.