2016-02-21 2 views
0

J'ai la structure suivanteopérateur de comparaison personnalisée pour struct personnalisé dans multiset C++

struct Node               
{ 
    int x0,y0,g,h,f; 
    int *Grid[N][N]; 
    Node* parent=NULL; 
    Node(int x=0,int y=0,int G=0,Node* node=NULL) 
    { 
     x0=x; 
     y0=y; 
     g=G; 
     parent=node; 
    } 
} 

et la définition multiset comme suit

multiset<Node*,GridLess>open_list; 

Gridless est la structure initiale pour l'opérateur de comparaison.

struct GridLess                  
{ 
    bool operator()(const Node *a,const Node *b) const 
    { 
     for(i=0;i<N;i++) 
     { 
      for(j=0;j<N;j++) 
      { 
       if(*a->Grid[i][j]!=*b->Grid[i][j]) 
       { 
        return *a->Grid[i][j]<*b->Grid[i][j]; 
       } 
      } 
     } 
     return false; 
    } 
}; 

Mon besoin fondamental était de trouver le Node dans le open_list qui a les mêmes éléments en même position dans la grille en utilisant multiset::count ou multiset::find qui est complété par l'opérateur de comparaison ci-dessus.

Maintenant, je veux la Node dans le open_list qui a les mêmes éléments en même position dans la grille ainsi que la même Node::g et Node::f

ce que j'ai essayé d'utiliser et échoué

struct GridLess                  
{ 
    bool operator()(const Node *a,const Node *b) const 
    { 
     for(i=0;i<N;i++) 
     { 
      for(j=0;j<N;j++) 
      { 
       if(*a->Grid[i][j]!=*b->Grid[i][j]) 
       { 
        return *a->Grid[i][j]<*b->Grid[i][j]||(*a->Grid[i][j]==*b->Grid[i][j]&&a->g<b->g)||((*a->Grid[i][j] == *b->Grid[i][j])&&(a->g==b->g)&&a->f<b->f); 
       } 
      } 
     } 
     return false; 
    } 
}; 

L'introduction de deux Nodes dans le open_list avec la même grille mais différente g ou f aboutit toujours à count=2.

J'ai essayé de vérifier juste le Grid et Node::g avec les éléments suivants

return *a->Grid[i][j]<*b->Grid[i][j]||(*a->Grid[i][j]==*b->Grid[i][j]&&a->g<b->g); 

Même cela ne fonctionne pas.

J'ai besoin d'un opérateur de comparaison pour ce problème et d'une explication de son fonctionnement.

EDIT

je me suis dit que je ne suis pas clair avec la fonction bool operator() que lorsque nous écrivons return a<b Je comprends qu'il retournera true si a<b mais ce qui va le retourner si a==b ou a>b si cela pourrait s'expliquer ensemble avec la question, cela serait vraiment utile.

+2

Ceci ne peut pas être votre vrai code. Il y a au moins un point-virgule manquant, et les variables de boucle dans 'Gridless' ne sont déclarées nulle part. S'il vous plaît poster ** code réel **. –

+0

@StoryTeller Chaque noeud contient des pointeurs int NxN vers un entier. Grille – PhoenixDD

+0

@ChristianHackl Ceci est le code, j'ai peut-être ignoré le point-virgule quelque part mais 'GridLess' est déclaré.Remarque: Si vous copiez et exécutez sur votre machine, placez la structure 'GridLess' au-dessus de la déclaration' multiset'. – PhoenixDD

Répondre

4

Vous devez faire une comparaison des g et f membres en dehors de la boucle. Tant qu'il se trouve dans la boucle, vous ne comparez pas les membres g et f dans le cas où les membres Grid sont égaux.

struct GridLess                  
{ 
    bool operator()(const Node *a,const Node *b) const 
    { 
     for(i=0;i<N;i++) 
     { 
      for(j=0;j<N;j++) 
      { 
       if(*a->Grid[i][j]!=*b->Grid[i][j]) 
       { 
        return *a->Grid[i][j]<*b->Grid[i][j]; 
       } 
      } 
     } 
     return std::tie(a->g, a->f) < std::tie(b->g, b->f); 
    } 
}; 
+0

Bon, comment je fais ça? J'ai essayé de le mettre dehors avec les mêmes résultats:/ – PhoenixDD

+0

Exemple de code ajouté. Bien sûr, tout va se casser, si vous avez un nullptr 'a' /' b' ou 'Grid' – Rumburak

+0

Merci beaucoup!, J'ai aussi fait une modification à ma question comme une extension, pourriez-vous être assez aimable pour expliquer que bien? . – PhoenixDD

1

Votre opérateur de comparaison ne s'est pas bien comporté. Comparer seulement les points de la grille d'abord dans une boucle, renvoyant le point A pointB. Si elles correspondent, alors comparez le reste des choses.

Je ne sais pas pourquoi ma réponse a été coupée, mais elle est la même que celle complète ci-dessus. Je pense que moins que commencé une balise ...

+0

Oui je suis conscient de cela mais je ne sais pas comment faire la comparaison, j'ai essayé beaucoup de choses, il serait utile si vous pourriez élaborer avec un exemple sur la façon de faire se comporte correctement. – PhoenixDD

+0

Pas de problème, merci pour votre aide :) – PhoenixDD