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

时间:2016-02-21 12:51:47

标签: c++ c++11 set comparison-operators multiset

我有以下结构

 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;
    }
};

我的基本需求是使用Nodeopen_list找到multiset::countmultiset::find在网格中相同位置的相同元素的Node比较运算符。

现在我想要open_list中的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; } }; Nodes

这是我尝试使用的失败

open_list

count=2中使用相同的网格但不同的g或f引入两个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但是如果{{{1}}会返回{{1}} {1}}或{{1}}如果可以与问题一起解释,那将非常有用。

2 个答案:

答案 0 :(得分:4)

gf成员的比较必须在循环之外。只要它在循环内部,如果g成员相等,您就不会比较fGrid成员。

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);
    }
};

答案 1 :(得分:1)

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

Dunno为什么我的答案被切断了,但它与上面的完整答案相同。我认为不仅仅是开始了一个标签...