多集 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::countmultiset::findopen_list 中找到在网格中相同位置具有相同元素的 Node上面的比较运算符。

现在我想要 open_list 中的 Node,它在网格中的相同位置具有相同的元素以及相同的 Node::gNode::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.

我尝试使用以下

检查 GridNode::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==ba>b 如果可以将其与问题一起解释,那将会非常有帮助。

你的比较运算符表现不佳。在循环中首先比较网格点,返回 pointA pointB。如果它们匹配,则比较其余的东西。

不知道为什么我的回答被截断了,但它和上面的完整答案是一样的。我觉得还不到开始标签...

您必须在循环之外比较 gf 成员。只要它在循环内,就不会比较 gf 成员,以防 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);
    }
};