Domanda

Sto cercando di inserire un valore di coppia in una mappa. Può map è composto da un oggetto e da un vettore di un altro oggetto. Non so perché, ma l'unico modo per realizzare il codice per compilare è dichiarare il primo oggetto come un puntatore. Ma in questo modo quando inserisco un oggetto, solo la prima coppia viene inserita nella mappa.

La mia mappa è questa:

map<prmEdge,vector<prmNode> > archi;

Questo è il codice:

{

bool prmPlanner::insert_edge(int from,int to,int h) {

prmEdge e; 
int f=from; 
int t=to; 
if(to<from){
    f=to;
    t=from; 
} 

e.setFrom(f);
e.setTo(t);

vector<prmNode> app;

prmNode par=nodes[e.getFrom()]; 
prmNode arr=nodes[e.getTo()];

app.push_back(par);
app.push_back(arr);

archi.insert(pair<prmEdge,vector<prmNode> >(e,app) );

return true;
 }

}

In questo modo, ho un errore nella compilazione nella coppia di classe. Cosa potevo fare?? Grazie mille.

È stato utile?

Soluzione

È necessario fornire un comparatore per PRMEDGE. La mia ipotesi è che utilizza il comparatore predefinito per la mappa, ad esempio confrontando l'indirizzo della chiave - che è sempre lo stesso perché e è locale.

Gli oggetti che fungono da chiavi nella mappa devono essere ordinati, quindi è necessario fornire un operatore per confrontare i bordi o una funzione comparatore per la mappa.

class EdgeComparator {
public:
   bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
      // ... ?
   }
};

map<prmEdge,vector<prmNode>, EdgeComparator > archi;

La parte davvero difficile è decidere come confrontare i bordi, quindi viene definito un ordine definitivo. Supponendo che tu abbia solo from e to Puoi provare con:

class EdgeComparator {
public:
   bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
      if ( emp1.from != emp2.from ) 
          return ( emp1.from < emp2.from );
      return ( emp1.to < emp2.to );
   }
};

Ordinerà sulla chiave primaria from e secondario to.

Altri suggerimenti

La classe prmEdge deve definire una funzione di confronto (il valore predefinito è operator<) lavorare con std::map. Anche se non pubblichi quel codice, mi aspetto che sia il tuo problema (per il record, il puntatore ha un operator< definito.

struct A {
    int a;
    bool operator<(A other)
    {
        return a < other.a;
    }
};

struct B {
    int b;
};

bool cmp(B lhs, B rhs)
{
    return lhs.b < rhs.b;
}

std::map<A, int> map_a;
std::map<B, int, std::pointer_to_binary_function<B, B, bool> > map_b(std::ptr_fun(cmp));

Gli elementi della mappa sono ordinati dalle loro chiavi. Ma la mappa deve sapere come:

O sovraccaricare il < Operatore nella classe PRMEDGE ...

class prmEdge
{
    //...
    public:
        bool operator<(const prmEdge& right) const
        {
            //...
        }
};

... o specificare un comparatore per la mappa:

class Comparator
{
    public:
        bool operator()(const prmEdge& left, const prmEdge& right) const 
        {
          // ...
        }
};

map<prmEdge, vector<prmNode>, Comparator> archi;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top