2010-01-27 8 views
0

J'essaie d'insérer une valeur paire dans une carte. La carte peut être composée d'un objet et d'un vecteur d'un autre objet. Je ne sais pas pourquoi mais la seule façon de faire le code à compiler est de déclarer le premier objet comme un pointeur. Mais de cette façon, lorsque j'insère un objet, seule la première paire est placée sur la carte.Insérer une paire d'objets dans une carte

Ma carte est la suivante:

map<prmEdge,vector<prmNode> > archi; 

Voici le code:

{

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; 
} 

}

De cette façon, j'ai une erreur de compilation dans le classe pair.h. Que pouvais-je faire ?? Merci beaucoup.

+0

Quelle erreur avez-vous? – kennytm

Répondre

1

Vous devez fournir un comparateur pour prmEdge. Je suppose qu'il utilise le comparateur par défaut pour la carte, par ex. comparer l'adresse de la clé - qui est toujours la même, car e est local.

Les objets qui servent de clés sur la carte doivent être commandés, vous devez donc fournir un opérateur pour comparer les bords ou une fonction de comparaison pour la carte.

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

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

La partie la plus difficile est de décider comment comparer les bords afin de définir un ordre définitif. En supposant que vous n'avez from et to Vous pouvez essayer avec:

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); 
    } 
}; 

Il triera sur clé primaire from et to secondaire.

+0

Je pense avoir résolu mon problème. Merci beaucoup!!! – livio8495

1

La classe prmEdge doit définir une fonction de comparaison (la valeur par défaut est operator<) pour fonctionner avec std::map. Bien que vous ne publiez pas ce code, j'attendre à ce que d'être votre problème (pour l'enregistrement, le pointeur a un operator< défini.

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)); 
0

éléments de la carte sont commandés par leurs clés. Mais la carte a besoin de savoir comment :

de toute surcharge l'opérateur < dans la classe prmEdge ...

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

... ou spécifier un comparateur pour la carte:

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

map<prmEdge, vector<prmNode>, Comparator> archi; 
Questions connexes