Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]function object e sort

    Ciao.
    Devo richiamare un sort su un array con un less operator personalizzato.
    In pratica tutto questo deve portare alla renumerazione di entità secondo 3 parametri:
    x,y e z.
    Gli elementi da usare(che compongono il mio vector) sono CEntity che hanno un point , ovvero un x,y e z
    devo poter fare il sort di questi CEntity e cambiare l'ordinamento secondo diversi operatori di confronto:

    posso ordinare per prima x poi y e poi z o ad es per prima y poi x e poi z e cosi via.
    Vorrei utilizzare il sort dell' stl.

    è possibile non creare piu di un operatore di confronto ?
    ciao.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    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.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.