Inserire una coppia di oggetti in una mappa
-
23-09-2019 - |
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.
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;