多集C++中自定义结构的自定义比较运算符

Custom comparison operator for custom struct in multiset C++

本文关键字:自定义 比较 运算符 结构 多集 C++      更新时间:2023-10-16

我有以下结构

 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::find在网格中的相同位置找到open_list中具有相同元素的Node,这由上述比较运算符完成。

现在我想在open_listNode,它在网格中的相同位置具有相同的元素以及相同的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;
    }
};

在具有相同网格但不同 g 或 f 的open_list中引入两个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我知道它会返回true如果a<b但如果a==ba>b如果这可以与问题一起解释,它会返回什么,这将是非常有帮助的。

gf成员的比较必须在循环之外。只要它在循环内,如果Grid成员相等,则不会比较gf成员。

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。 如果它们匹配,则比较其余的东西。

不知道为什么我的答案被切断了,但它与上面的完整答案相同。我认为比开始一个标签还少...