【发布时间】:2021-05-27 22:37:20
【问题描述】:
以下代码不适用于 MSVC++ 2019,但适用于 GCC 编译器。
#include <set>
#include <string>
#include <iostream>
struct MyData {
MyData() {}
MyData(std::string keyA, std::string keyB) :keyA(keyA), keyB(keyB) {}
std::string keyA;
std::string keyB;
};
struct Compare {
bool operator() (const MyData& lhs, const MyData& rhs) const
{
if (lhs.keyA < rhs.keyA)
return true;
if (lhs.keyB < rhs.keyB)
return true;
else
// All else conditions would be false
return false;
}
};
int main()
{
std::set<MyData, Compare> s;
s.insert(MyData("Clark", "Alice"));
s.insert(MyData("Bob", "Alice"));
s.insert(MyData("Alice", "Bob"));
s.insert(MyData("Derek", "Clark"));
for (auto& i : s)
{
std::cout << i.keyA << ", " << i.keyB << std::endl;
}
}
这是 MSVC 上的错误:
在 GCC 上,它显示以下输出:
Alice, Bob
Bob, Alice
Clark, Alice
Derek, Clark
Process returned 0 (0x0) execution time : 0.971 s
Press any key to continue.
这个错误是什么原因造成的,如何正确定义算子?
【问题讨论】:
-
如果
lhs.keyA == "Bob"和rhs.keyA == "Alice"会发生什么? -
请注意,您可以使用
std::tie非常紧凑地执行字典比较 -
注意:如果您还没有注意到,按重试调试应用程序是给程序员的最好建议。
-
Visual Studio 确实在为调试配置生成的可执行文件中添加了一些检查。在这种情况下,我猜问题是您的比较器不是反对称的。
-
输出不是您想要的。您想查看导致失败的值。如果你知道这些,你就会很清楚在哪里放置断点以便在程序失败之前停止程序,然后逐步检查问题区域以查看导致失败的原因。
标签: c++ set comparator