多集 C++ 中自定义结构的自定义比较运算符
Custom comparison operator for custom struct in 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;
}
}
和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
在 open_list
中找到在网格中相同位置具有相同元素的 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
中引入两个具有相同网格但不同 g 或 f 的 Nodes
仍然会导致 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
我理解它会 return true
如果 a<b
但是return if a==b
或 a>b
如果可以将其与问题一起解释,那将会非常有帮助。
你的比较运算符表现不佳。在循环中首先比较网格点,返回 pointA pointB。如果它们匹配,则比较其余的东西。
不知道为什么我的回答被截断了,但它和上面的完整答案是一样的。我觉得还不到开始标签...
您必须在循环之外比较 g
和 f
成员。只要它在循环内,就不会比较 g
和 f
成员,以防 Grid
成员相等。
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);
}
};
我有以下结构
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
在 open_list
中找到在网格中相同位置具有相同元素的 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
中引入两个具有相同网格但不同 g 或 f 的 Nodes
仍然会导致 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
我理解它会 return true
如果 a<b
但是return if a==b
或 a>b
如果可以将其与问题一起解释,那将会非常有帮助。
你的比较运算符表现不佳。在循环中首先比较网格点,返回 pointA pointB。如果它们匹配,则比较其余的东西。
不知道为什么我的回答被截断了,但它和上面的完整答案是一样的。我觉得还不到开始标签...
您必须在循环之外比较 g
和 f
成员。只要它在循环内,就不会比较 g
和 f
成员,以防 Grid
成员相等。
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);
}
};