Sort di vector STL

di il
10 risposte

Sort di vector STL

Sto esercitandomi con i vector della libreria STL ma questo codice mi restituisce all'esecuzione questo messaggio: "segmentation fault"
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct app {
	int max;
	int dup;
};

bool mycmp(struct app a, struct app b) {
	if (a.max >= b.max)
		return true;
	return false;
}

int main() {
	int N;
	N = 100;
	vector <app> vapp(N);
	for (int i=0; i<N; ++i) {
		vapp[i].max = -1;
		vapp[i].dup = 0;
	}
	sort(vapp.begin(), vapp.end(), mycmp );
}
perchè questo comportamento ?

10 Risposte

  • Re: Sort di vector STL

    Copio e incollo esempio da vecchio thread
    
    #include <iostream>
    #include <algorithm>
    #include <vector> 
    
    using namespace std;
    
    struct immobile{
        char topologia;
        int  dimensione;
    };
    
    class myImmobile{
    
    public:
        void crea (){
          immobili.push_back({'A',32});
          immobili.push_back({'B',71});
          immobili.push_back({'C',12});
          immobili.push_back({'D',45});
          immobili.push_back({'E',26});
          immobili.push_back({'F',80});
          immobili.push_back({'G',53});
          immobili.push_back({'H',33});      
        }
        void ordinamento() {
            sort (immobili.begin(), immobili.end(), [ ] (immobile i, immobile j) { return i.dimensione < j.dimensione; });
        }
        void stampa(){
            for (auto it = immobili.begin(); it != immobili.end(); it++)
                cout << (*it).topologia << ' ' << (*it).dimensione << ' ';
            cout << endl;   
        } 
    private:
        vector<immobile>immobili; 
    };
    
    int main (void) {
        myImmobile test;
        
        test.crea();
        test.stampa();
        test.ordinamento();    
        test.stampa();    
    
        return 0;
    }
    
    
  • Re: Sort di vector STL

    Aggiungo che la funzione di comparazione dovrebbe prendere come argomenti reference a costanti.
  • Re: Sort di vector STL

    _Achille ha scritto:


    Aggiungo che la funzione di comparazione dovrebbe prendere come argomenti reference a costanti.
    Dall'esempio sul sito cplusplus
    non mi pare che i parametri all'interno della funzione siano reference a costanti.
  • Re: Sort di vector STL

    Weierstrass ha scritto:


    
        void ordinamento() {
            sort (immobili.begin(), immobili.end(), [ ] (immobile i, immobile j) { return i.dimensione < j.dimensione; });
        }
     
    Non avevo mai visto del codice dove all'interno del sort si definisce una funzione ed al tempo stesso la si richiama, dove trovo documentazione in proposito ? Mi è' oscura la parte [ ] .

    PS
    tra l'altro noto che anche in questo esempio i parametri i e j all'interno della funzione "compare" non sono reference a costanti.
  • Re: Sort di vector STL

    Si chiama lambda

    https://en.cppreference.com/w/cpp/language/lambd

    È un modo comodo per definire una funzione all'interno di un'altra funzione quando la usi solo lì, l'esempio tipico è appunto il sort

    Ma va bene anche il modo standard. Il punto dell'esempio erano i vector di strutture
  • Re: Sort di vector STL

    zio_mangrovia ha scritto:


    _Achille ha scritto:


    Aggiungo che la funzione di comparazione dovrebbe prendere come argomenti reference a costanti.
    Dall'esempio sul sito cplusplus
    non mi pare che i parametri all'interno della funzione siano reference a costanti.
    https://en.cppreference.com/w/cpp/algorithm/sor

    Non usare i reference comporta una copia dell’intera struttura
  • Re: Sort di vector STL

    Mi sembra però che non sia stata fatta nessuna ipotesi circa l'errore di segmentazione. A tal proposito quel codice a me compila e viene eseguito senza problemi.

    @zio_mangrovia hai provato a fare un po' di debug per cercare di capire quale potrebbe essere l'origine del problema? Per esempio commentando la riga del sort nel main l'errore persiste?
  • Re: Sort di vector STL

    La std::sort richiede una funzione che soddisfi uno "strict weak ordering" altrimenti può entrare in un loop infinito o crashare.

    Quindi deve essere
    
    bool mycmp(const struct app &a, const struct app &b) 
    {
       return b.max < a.max);
    }
    
  • Re: Sort di vector STL

    Nippolo ha scritto:


    @zio_mangrovia hai provato a fare un po' di debug per cercare di capire quale potrebbe essere l'origine del problema? Per esempio commentando la riga del sort nel main l'errore persiste?
    si ho provato proprio quello che dici tu, e commentandolo il sort l'errore di esecuzione sparisce.
    Se abbassavo il numero N di valori non dava errori tipo con 10. Ho provato a rimuovere nel mycmp il simbolo >= e mettere solo > risolvendo il problema, ma non capisco il perchè.
  • Re: Sort di vector STL

    oregon ha scritto:


    La std::sort richiede una funzione che soddisfi uno "strict weak ordering" altrimenti può entrare in un loop infinito o crashare.
    Esatto solo in quel modo ha funzionato! Ho fatto diversi test.
    Grazie
Devi accedere o registrarti per scrivere nel forum
10 risposte