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

时间:2015-10-25 23:29:12

标签: c++ operator-overloading

如何更改运算符<让我的逻辑工作?

我是这样尝试的,但它没有用。

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。

1 个答案:

答案 0 :(得分:0)

如果您希望集合中的两个项目比较等效,则比较器必须为(a,b)或(b,a)生成等价。你的功能没有这样做。

看起来你想忽略任何两个比较相等且基于不平等的排序?

为此,您必须选择如何相对于彼此订购所有orig和dest!

以下工作方法是为每个链接排序orig和dest,然后比较最小的链接。只有当最小值相等时我们才会比较较大的。

import fileinput

for line in fileinput.input():
    print line

示例:

  • (1 2)&lt; (2 2)
  • (1 2)&lt; (1 3)

希望这有帮助。