Sort di vector STL

di zio_mangrovia il
10 risposte
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

  • 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;
    }
    
    
  • Aggiungo che la funzione di comparazione dovrebbe prendere come argomenti reference a costanti.
  • _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.
  • 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.
  • 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
  • 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
  • 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?
  • 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);
    }
    
  • 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è.
  • 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