Ordinare un vetctor di struct

di il
9 risposte

Ordinare un vetctor di struct

Ciao a tutti vorrei ordinare questo vector <CqiFeedbak> vettore:
dove CqiFeedback è una struct fatta in questo modo:

struct CqiFeedback
  {
    /** the sub channel */
    int m_subChannelId; 
    /** the cqi feedback */
    int m_cqi; 
  };
ora ho aggiunto questo codice nel file header dove è contenuto il vettore cercando di ridefinire gli operatori per usare il metodo sort della STL:

class UeRecord : public Object
{
public:
  UeRecord ();
  ~UeRecord ();

  /**
   * \brief CqiFeedbacks represents a list of CQI feedbacks
   * sent by the UE. The downlink packet scheduler of
   * the eNB uses these values to assign accordingly
   * radio resources.
   */
  struct CqiFeedback
  {
    /** the sub channel */
    int m_subChannelId; 
    /** the cqi feedback */
    int m_cqi; 
  };
  
  /**
   * \brief a list of CQI feedbacks
   */
  typedef std::vector<struct CqiFeedback> CqiFeedbacks;



  /**
   * \brief Creates a ue record of the UE registered into the eNB
   * \param ue the pointer of the ue device
   * \param enb the pointer of the enb device
   */
  UeRecord (Ptr<NetDevice> ue, Ptr<NetDevice> enb);

  /**
   * \brief Set the UE of the record
   * \param ue the pointer of the ue device
   */
  void SetUe (Ptr<NetDevice> ue);

  /**
   * \brief Get the UE of the record
   * \returns the pointer of the UE
   */
  Ptr<NetDevice> GetUe (void);

  /**
   * \brief Set the eNB of the record
   * \param enb the pointer of the enb device
   */
  void SetEnb (Ptr<NetDevice> enb);

  /**
   * \brief Get the eNB of the record
   * \returns the pointer of the eNB
   */
  Ptr<NetDevice> GetEnb (void);


  /**
   * \brief Set CQI feedbacks of the registered UE
   * \param cqiFeedbacks a list of CQI feedback
   */
  void SetCqiFeedbacks (CqiFeedbacks cqiFeedbacks);

  /**
   * \brief Get CQI feedbacks of the registered UE
   * \returns a list of CQI feedback
   */
  CqiFeedbacks GetCqiFeedbacks (void);


private:
  Ptr<NetDevice> m_ue;
  Ptr<NetDevice> m_enb;
  CqiFeedbacks m_cqiFeedbacks;
  friend bool operator < (const struct CqiFeedback &a, const struct CqiFeedback &b);
  friend bool operator == (const struct CqiFeedback &a, const struct CqiFeedback &b);
  friend bool operator != (const struct CqiFeedback &a, const struct CqiFeedback &b);
};

inline bool operator == (const struct CqiFeedback &a, const struct CqiFeedback &b)
{
  if();
}


inline bool operator != (const struct CqiFeedback &a, const struct CqiFeedback &b)
{
}

inline bool operator < (const struct CqiFeedback &a, const struct CqiFeedback &b)
{

}

nelle funzioni inline pero se cerco di confrontare i parametri 'a' e 'b' non mi fa accedere ai campi della struttura...
perchè?
grazie dell'eventuale aiuto

9 Risposte

  • Re: Ordinare un vetctor di struct

    CqiFeedback non esiste al di fuori di UeRecord, pertanto il compilatore non sa cosa fare nelle tue funzioni inline esterne alla classe.
    Invece se utilizzi quelle interne alla classe si, ma devono essere public, non private.
    
    private:
      Ptr<NetDevice> m_ue;
      Ptr<NetDevice> m_enb;
      CqiFeedbacks m_cqiFeedbacks;
      
    // Qui il compilatore sa cos'è CqiFeedback, ma le funzioni devono essere nella sezione public:
      friend bool operator < (const struct CqiFeedback &a, const struct CqiFeedback &b);
      friend bool operator == (const struct CqiFeedback &a, const struct CqiFeedback &b);
      friend bool operator != (const struct CqiFeedback &a, const struct CqiFeedback &b);
    };
    
    // Qui il compilatore non ha idea di cosa sia CqiFeedback dato che è una nested struct.
    inline bool operator == (const struct CqiFeedback &a, const struct CqiFeedback &b)
    {
      if();
    }
    
    
  • Re: Ordinare un vetctor di struct

    Shodan grazie della risposta
    mi pare di aver capito che devo spostare nella sezione public le funzioni friend giusto?

    se è cosi....non funziona ancora...

    quando faccio (lavoro su eclipse cdt) a. (e cliccp ctrl+space per il completamento automatico) non mi escono gli attributi della struct
  • Re: Ordinare un vetctor di struct

    No, shodan sta dicendo che le funzioni di overload devono essere sviluppate all'interno della classe non fuori. In più bisogna metterle nella sezione public così vengono viste anche fuori dalla classe stessa, in quanto ti serve se devi utilizzare gli operatori.
  • Re: Ordinare un vetctor di struct

    Grazie ora funziona...
    avevo adattato l'esempio trovato su internet..ma si vede che era sbagliato anche quello...
  • Re: Ordinare un vetctor di struct

    Ragazzi ho un problema,
    ho tolto la nested struct e l'ho inserita in un file miscellaneous.h in quanto mi serviva che fosse visibile da un altra parte...oltre a ciò ho scritto il codice come mi avete consigliato (cioè inserendo tutto nella sezione public)ma non funziona...mi da il seguente errore..
    
    debug/ns3/ue-record.h:121: error: ‘bool ns3::UeRecord::operator>(const CqiFeedback&, const CqiFeedback&)’ must take exactly one argument
    
    girando un pò su internet, ho letto che essendo delle funzioni membro il secondo argomento se lo prende come this xò non riesco a capire come devo modificare il mio codice ...

    poi siccome devo ordinare il vettore in ordine decrescente io ho ridefinito solo l'operatore > , ma sort di stl non vede solo l'operatore <???
  • Re: Ordinare un vetctor di struct

    Togliendo la nested struct non ha più senso che le ridefinizioni di prima stiano in UeRecord, quindi puoi toglierle (ora CqiFeedback è visibile a tutti).

    Detto questo gli operatori possono essere definiti come visibili a tutti anch'essi.
    Dato che CqiFeedback è una struct (quindi decidi che i dati interni siano public di default), ti conviene definire gli operatori che vuoi ridefinire, sotto la struct stessa.
    
    struct CqiFeedback
      {
        /** the sub channel */
        int m_subChannelId;
        /** the cqi feedback */
        int m_cqi;
      };
    
    inline bool operator < (const CqiFeedback& a, const CqiFeedback& b) {
        // criterio per definire a < b 
    }
    // etc...
    
    Solo se decidi di rendere CqiFeedback una classe allora devi ridefinire operator< per la classe (per lo più si tratta di una comodità in modo da non complicarsi la vita con i friends).
    In tal caso è sufficiente scrivere:
    
    class CqiFeedback
      {
        /** the sub channel */
        int m_subChannelId;
        /** the cqi feedback */
        int m_cqi;
        public:
           bool operator < (const CqiFeedback& val) {
               // criterio per definire *this < val 
           }
      };
    
    poi siccome devo ordinare il vettore in ordine decrescente io ho ridefinito solo l'operatore > , ma sort di stl non vede solo l'operatore <???
    Per default si, ma si può usare la seconda versione come mostrato qui.
    http://www.cplusplus.com/reference/algorithm/sort
    Diciamo che di solito si implementano tutti gli operatori di confronto in modo da avere le mani libere. Da notare inoltre che in genere gli operatori di confronto sono globali (come per la struct per capirsi).
  • Re: Ordinare un vetctor di struct

    Grazie shodan,
    ma quindi se devo ordinare in modo decrescente, devo usare una funzione di comparazione come decritto qui? http://www.cplusplus.com/reference/algorithm/sort

    questa immagino che vada messa nella classe dove ho la struct?

    e le funzioni inline che ho definito prima le devo usare ancora o le posso eliminare, se uso la funzione comp?
  • Re: Ordinare un vetctor di struct

    theStorx ha scritto:


    grazie shodan,
    ma quindi se devo ordinare in modo decrescente, devo usare una funzione di comparazione come decritto qui?
    Si, perché la versione "normale" di sort utilizza < per la comparazione.
    questa immagino che vada messa nella classe dove ho la struct?
    No. Ora che CqiFeedback è indipendente, tutto quello che la riguarda deve essere indipendente.
    e le funzioni inline che ho definito prima le devo usare ancora o le posso eliminare, se uso la funzione comp?
    No. Semmai vanno integrate. La funzione comp si limiterà a usare le tue funzioni.
    Tra l'altro è preferibile usare un function object invece di una funzione perché la chiamata avverrà inline.
    
    struct CqiFeedback
      {
        /** the sub channel */
        int m_subChannelId;
        /** the cqi feedback */
        int m_cqi;
      };
    
    // seguono criteri per la comparazione.
    // <, <=, >, >=, ==, !=
    inline bool operator < (const CqiFeedback& a, const CqiFeedback& b) {
        // criterio per definire a < b
    }
    // etc...
    
    // function object per la comparazione per std::sort
    struct compare {
        bool operator(const CqiFeedback& a, const CqiFeedback& b) {
            return a < b;
            // return a > b;
        }
    }
    
    ...
    // crea un oggetto temporaneo di tipo compare per operare sull'insieme del vector.
    std::sort(vec.begin(),vec.end(), compare());
    
    Questo in teoria.
    In pratica, dato l'uso frequente di function object per la comparazione tra elementi, la libreria standard provvede già a fornire dei function objects già pronti.
    http://www.cplusplus.com/reference/std/functional
    (greater nel tuo caso).
    
    // crea un oggetto temporaneo di tipo greater<CqiFeedback> per operare sull'insieme del vector.
    std::sort(vec.begin(),vec.end(), greater<CqiFeedback>() );
    

    Ma gli operatori di confronto su CqiFeedback li creare tu.
  • Re: Ordinare un vetctor di struct

    Grazie shodan...
    grazie a tutti come farei senza di voi
Devi accedere o registrarti per scrivere nel forum
9 risposte