Ordinamento di un vettore (Interfaccia C++)

di il
10 risposte

Ordinamento di un vettore (Interfaccia C++)

Ciao dovrei ordinare il mio file, in base alla dimensione dell'immobile, dove in ogni riga del file
sono memorizzate le seguenti informazioni relative ad un singolo immobile (separate da spazio):
codice identificativo (numero intero), comune (stringa), provincia (stringa di due caratteri),
dimensione in metri quadri (intero), topologia (carattere A per appartamento, T per terratetto, V per
villetta a schiera), prezzo (numero in virgola mobile).

ho provato con questo codice ma non riesco a capire perchè non lo riordina

void MainWindow::ordinamento()
{
    ui->textEdit->setText("");
    if (immobili.size()>0)
    {
        string tmp; (variabile di appoggio per scambio) 

        vector<immobile>::iterator w=immobili.begin();
        vector<immobile>::iterator walk=w+1;    

            for (w=immobili.begin();w!= immobili.end(); w++)
            {
              
        for (walk=w+1;walk != immobili.end();walk++)
        {

          if ((*w).getDimensione()>(*walk).getDimensione())

          {
    (scambio gli elementi) 
            tmp=(*w).Tostring();
           (*w).Tostring()=(*walk).Tostring();
            (*walk).Tostring()=tmp;
            

         
          }
     }

}


    }
    else {
        QMessageBox::warning(this,"immobili","Non ci sono immobili");
    }

}

10 Risposte

  • Re: Ordinamento di un vettore (Interfaccia C++)

    Usa i tag code per il codice
  • Re: Ordinamento di un vettore (Interfaccia C++)

    Come faccio ad aggiungere i tag code ?
  • Re: Ordinamento di un vettore (Interfaccia C++)

    Vai in "Editor completo e anteprima", tra i pulsanti ci sono quelli per i tag 'code'. Ti metti all'inizio del codice ed inserisci la coppia di tag, poi tagli il tag di chiusura e lo porti alla fine del codice.
  • Re: Ordinamento di un vettore (Interfaccia C++)

    Senza entrare nel dettaglio del tuo codice, l'ordinamento di strutture si fa così (modificando l'esempio ufficiale del sort):
    
    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    struct immobile{
        char topologia;
        int  dimensione;
    };
    
    struct myclass {
      bool operator() (immobile i, immobile j) { return i.dimensione < j.dimensione; }
    } myobject;
    
    int main (void) {
      immobile imm[8] = {{'A',32},{'B',71},{'C',12},{'D',45},{'E',26},{'F',80},{'G',53},{'H',33}};
      vector<immobile> myvector (imm, imm + sizeof(imm)/sizeof(immobile));
    
      sort (myvector.begin(), myvector.end(), myobject);
    
      cout << "Ordinamento: ";
      for (auto it = myvector.begin(); it != myvector.end(); it++)
        cout << ' ' << (*it).topologia << ' ' << (*it).dimensione;
      cout << endl;
    
      return 0;
    }
    
  • Re: Ordinamento di un vettore (Interfaccia C++)

    Ho provato e ho creato nel mio file.h la funzione bool
    
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include"immobile.h"
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    private slots:
        void crea ();
        void salva ();
        void esci ();
        void open ();
        void media ();
        void cercaComune ();
        void cercaTipo ();
        void ordinamento ();
        void visualizza ();
        bool ordina(immobile a,immobile b);
    
    
    private:
        Ui::MainWindow *ui;
        vector<immobile>immobili ;
    
    };
    poi sono andato nel file.cpp e ho implementato in questo modo
    
    bool MainWindow::ordina(immobile a, immobile b)
    {
      return  (a.getDimensione() () < b.getDimensione());
    
    
    
    
    }
    utilizzando poi la funzione sort sempre nel file.cpp
    
    void MainWindow::ordinamento()
    {
     
        sort(immobili.begin(),immobili.end(),ordina);
    
    
    }
    ma mi da questo erraro che non riesco a capire

    error: must use '.*' or '->*' to call pointer-to-member function in '((__gnu_cxx::__ops::_Iter_comp_iter<bool (MainWindow::*)(immobile, immobile)>*)this)->__gnu_cxx::__ops::_Iter_comp_iter<bool (MainWindow::*)(immobile, immobile)>::_M_comp (...)', e.g. '(... ->* ((__gnu_cxx::__ops::_Iter_comp_iter<bool (MainWindow::*)(immobile, immobile)>*)this)->__gnu_cxx::__ops::_Iter_comp_iter<bool (MainWindow::*)(immobile, immobile)>::_M_comp) (...)'
    { return bool(_M_comp(*__it1, *__it2)); }
    ^
    ^
  • Re: Ordinamento di un vettore (Interfaccia C++)

    
      return  (a.getDimensione() () < b.getDimensione());
    
    Due coppie di parentesi?

    Comunque leggi bene il codice postato e adattalo di conseguenza alle classi.
  • Re: Ordinamento di un vettore (Interfaccia C++)

    Hai ragione !!
    togliendo le coppie di parentesi mi da comunque errore
  • Re: Ordinamento di un vettore (Interfaccia C++)

    Perché hai copiato male. Leggi meglio
  • Re: Ordinamento di un vettore (Interfaccia C++)

    struct myclass {
      bool operator() (immobile i, immobile j) { return i.dimensione < j.dimensione; }
    } myobject;
    non riesco a capire dove collocare questa parte nel mio codice
  • Re: Ordinamento di un vettore (Interfaccia C++)

    Dichiarala come lambda così la metti dove ti serve
    
    #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;
    }
    
    
Devi accedere o registrarti per scrivere nel forum
10 risposte