重载运算符< to (0, 1) = (0, 1) 和 (0, 1) = (1, 0)

Overloading operator< to (0, 1) = (0, 1) and (0, 1) = (1, 0)

本文关键字:运算符 lt 重载 to      更新时间:2023-10-16

如何更改操作符<让我的逻辑起作用?>

我试过了,但是没有用。

struct simpleLink {
    int orig;
    int dest;
    bool operator<(const simpleLink& otherLink) const
    {
        if(orig == otherLink.orig)
            return dest < otherLink.dest;
        else if (orig == otherLink.dest)
            return dest < otherLink.orig;
        else
            return orig < otherLink.orig;
    }
}

从我的角度来看,它应该是工作的,但它不是…

当我有一组simpleLink和i插入(0,1),然后我尝试插入(1,0),它不应该插入

的例子:

int main() {
    set<simpleLink> test;
    simpleLink secureLink;
    secureLink.orig = 0;
    secureLink.dest = 1;
    simpleLink secureLink2;
    secureLink2.orig = 1;
    secureLink2.dest = 0;
    cout << secureLink.orig << " " << secureLink.dest << endl;
    cout << secureLink2.orig << " " << secureLink2.dest << endl;
    test.insert(secureLink);
    test.insert(secureLink2);
    cout << "Test Size:" << test.size() << endl;
    return 0;
}

输出是:

0 1
1 0
Test Size: 2

如果您希望集合中的两个项进行等价比较,比较器必须产生(a,b)或(b,a)的等价。你的函数不这样做。

您似乎想忽略比较相等的任意两个,并根据不相等进行排序?

为此,您必须选择如何对所有原点和dest进行相对排序!

下面的工作方式是对每个链接的origin和dest进行排序,然后比较最小的。只有当最小的相等时,我们才能比较较大的。

bool operator<(const simpleLink& that) const
{
  auto this2 = std::minmax( orig,      dest );
  auto that2 = std::minmax( that.orig, that.dest );
  return (this2.first != that2.first) 
       ? (this2.first  < that2.first)
       : (this2.second < that2.second);
}

例子:

  • (1 2) <(2 2)
  • (1 2) <(3)