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.
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 **. –
@StoryTeller Chaque noeud contient des pointeurs int NxN vers un entier. Grille – PhoenixDD
@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