重载 operator< 到 (0, 1) = (0, 1) 和 (0, 1) = (1, 0)

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

如何更改运算符<以使我的逻辑正常工作?

我正在尝试这样,但它不起作用。

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 并且我插入 (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

集合的大小应为 1。

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

您似乎想忽略比较相等的任何两个并根据不等于排序?

为此,您必须选择如何相对于彼此排序所有原点和目标!

下面的工作是对每个 link 的 orig 和 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) < (1 3)

希望对您有所帮助。