由于comperator

时间:2017-06-06 16:56:01

标签: c++ linux visual-studio

我有一个在Linux上运行的C ++代码但我在Windows上遇到了Visual C ++的错误。代码如下:

struct dependence {
    dependence() {}
    dependence(string CUid, LID sink, LID source, std::string var)
    : CUid(CUid), sink(sink), source(source), var(var) {}

    string CUid;

    LID sink = 0;
    LID source = 0;
    std::string var;
};

struct dependenceCompare {
    bool operator() (const dependence& lhs, const dependence& rhs) const{
    return ((lhs.CUid<rhs.CUid) || (lhs.source<rhs.source) || (lhs.sink < rhs.sink) || (lhs.var < rhs.var));

    }
};

在Windows上运行代码时出现以下错误:

  

Debug Assertion Failed!“c:\ windows \ system32 \ MSCP120D.dll c:\ Program Files \ Microsoft Visual Studio 12.0 \ VC \ include \ xtree line 1795 Expression:invalid operator&lt;   当我将比较器更改为只有一个if子句时,它可以工作:

struct dependenceCompare {
    bool operator() (const dependence& lhs, const dependence& rhs) const{
        return ((lhs.CUid < rhs.CUid));
    }
};

我已经阅读了这个帖子,但是无法找到问题所在以及为什么它在Linux中使用 cmake 而不是在Visual Studio C ++中工作。

1 个答案:

答案 0 :(得分:6)

a.i < b.i || a.j < b.j之类的东西不是严格的弱排序&#34;根据{{​​1}}之类的要求,因为它意味着给定两个项目,每个项目可以比另一个项目少。

看到这种形式的多场比较很常见:

std::map

这可能更像你想要的:给一个领域优先,但使用另一个领域打破关系。

您可以使用std::tie

简化该代码
if(a.i != b.i) return a.i < b.i;
if(a.j != b.j) return a.j < b.j;
return a.k < b.k;

对于您的代码,它将是:

return (std::tie(a.i, a.j, a.k) < std::tie(b.i, b.j, b.k));