gpt4 book ai didi

c++ - 由于比较器,Visual C++ 抛出映射异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:45 33 4
gpt4 key购买 nike

我有一个在 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< When I change the comparator to just one if clause, it works:

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));

关于c++ - 由于比较器,Visual C++ 抛出映射异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44395740/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com