Ordinamento di un vettore (Interfaccia C++)

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

  • Usa i tag code per il codice
  • Come faccio ad aggiungere i tag code ?
  • 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.
  • 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;
    }
    
  • 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)); }
    ^
    ^
  • 
      return  (a.getDimensione() () < b.getDimensione());
    
    Due coppie di parentesi?

    Comunque leggi bene il codice postato e adattalo di conseguenza alle classi.
  • Hai ragione !!
    togliendo le coppie di parentesi mi da comunque errore
  • Perché hai copiato male. Leggi meglio
  • 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
  • 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