视觉C 由于comperator提供了映射异常

Visual C++ throws map exception because of comperator

本文关键字:映射 异常 由于 comperator 视觉      更新时间:2023-10-16

我有一个在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断言失败了! 当我将比较器更改为仅一个条款时,它有效:

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

我已经阅读了此线程,但无法确定问题在哪里以及为什么它在Linux中使用 cmake ,而不是在Visual Studio C 中。

诸如a.i < b.i || a.j < b.j之类的东西不是std::map之类的东西所要求的"严格弱订购",因为这意味着给定两个项目,每个项目都比另一个小。

通常看到此形式的多场比较:

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;

这可能更像是您想要的:对一个字段的优先级,但使用另一个字段打破领带。

您可以使用std::tie

简化该代码
return (std::tie(a.i, a.j, a.k) < std::tie(b.i, b.j, b.k));

对于您的代码,将是:

return ( std::tie(lhs.CUid, lhs.source, lhs.sink, lhs.var)
         < std::tie(rhs.CUid, rhs.source, rhs.sink, rhs.var));