【发布时间】:2016-02-21 12:51:46
【问题描述】:
我有以下结构
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;
}
}
和multiset的定义如下
multiset<Node*,GridLess>open_list;
Gridless是比较运算符的初始结构。
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;
}
};
我的基本需求是使用multiset::count或multiset::find在网格中的相同位置找到Node中的Node,由上述比较运算符完成。
现在我想要open_list 中的Node,它在网格中的相同位置具有相同的元素以及相同的Node::g 和Node::f
这是我尝试使用但失败了
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;
}
};
在open_list 中引入两个Nodes 具有相同的网格但不同的g 或f 仍然会导致count=2。
我尝试使用以下内容仅检查 Grid 和 Node::g
return *a->Grid[i][j]<*b->Grid[i][j]||(*a->Grid[i][j]==*b->Grid[i][j]&&a->g<b->g);
即使这样也行不通。
我需要一个比较运算符来解决这个问题并解释它是如何工作的。
编辑
我想我不清楚 bool operator() 函数,就像我们写 return a<b 时一样可以与问题一起解释这将非常有帮助。
【问题讨论】:
-
这不可能是您的真实代码。至少缺少一个分号,并且
Gridless中的循环变量没有在任何地方声明。请发布真实代码。 -
@StoryTeller 每个节点包含 NxN 个指向整数网格的 int 指针
-
@ChristianHackl 这是代码,我可能在某处跳过了分号,但声明了
GridLess。注意:如果您要在您的机器上复制和运行,请将GridLess结构放在multiset声明上方。 -
抱歉,语法突出显示让我失望(尽管您的命名约定不一致,所以您可能需要考虑一下)。
-
我一定会调查的,谢谢
标签: c++ c++11 set comparison-operators multiset