多集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;
}
};
在具有相同网格但不同 g 或 f 的open_list
中引入两个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
我知道它会返回true
如果a<b
但如果a==b
或a>b
如果这可以与问题一起解释,它会返回什么,这将是非常有帮助的。
g
和f
成员的比较必须在循环之外。只要它在循环内,如果Grid
成员相等,则不会比较g
和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];
}
}
}
return std::tie(a->g, a->f) < std::tie(b->g, b->f);
}
};
您的比较运算符表现不佳。 在循环中仅首先比较网格点,返回点 A 点 B。 如果它们匹配,则比较其余的东西。
不知道为什么我的答案被切断了,但它与上面的完整答案相同。我认为比开始一个标签还少...
相关文章:
- C++自定义比较函数
- std::设置自定义比较器
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- 使用迭代器的自定义比较器函数
- 标准::p riority_queue 的自定义比较器背后的逻辑
- Cython中带有自定义比较器的优先级队列
- gtest 期望无序元素与自定义比较器/匹配器一起使用
- 为什么在类或结构中传递自定义比较器函数?
- 使用自定义比较函数在类内进行列表排序
- 在priority_queue中使用默认容器但自定义比较器
- 是否有任何统一的方法可以在 c++ 中创建自定义比较器?
- C++ priority_queue与自定义比较器并删除任何项目
- 如何在 C++11 中将 std::max 与自定义比较器一起使用?
- 通过函数指针对类内的 STL SET 使用自定义比较器
- 基于对象的两个属性的自定义比较器会引发异常
- 如何使用自定义比较器初始化类数据成员,该成员是 std::set