Question

J'essaie d'insérer une valeur de paire dans une carte. May Map est composé par un objet et un vecteur d'un autre objet. Je ne sais pas pourquoi mais la seule façon de créer 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 mise dans la carte.

Ma carte est la suivante:

map<prmEdge,vector<prmNode> > archi;

Ceci est 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 la paire de classes.h. Que pouvais-je faire?? Merci beaucoup.

Était-ce utile?

La solution

Vous devez fournir un comparateur pour Prmedge. Je suppose qu'il utilise le comparateur par défaut pour MAP, par exemple en comparant l'adresse de la clé - qui est toujours la même parce que e est local.

Les objets qui servent de clés dans la carte doivent être commandés, vous devez donc soit fournir un opérateur pour comparer les bords, soit 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 vraiment difficile est de décider comment comparer les bords afin qu'un ordre définitif soit défini. En supposant que vous avez seulement 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 la clé primaire from et secondaire to.

Autres conseils

La classe prmEdge doit définir une fonction de comparaison (la valeur par défaut est operator<) travailler avec std::map. Bien que vous ne postez pas ce code, je m'attendrais à ce que ce soit votre problème (pour le dossier, 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));

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

Soit surcharger le < Opérateur dans la classe Prmedge ...

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

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

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

map<prmEdge, vector<prmNode>, Comparator> archi;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top