我的代码在我的 Visual Studio 2010 上有一些问题,但在 DevCPP 上没有。这是情况,我使用了 C++ STL set
在我的代码中插入 pair<string, double>
但后来我想要我的 set
使用值而不是键对它们进行排序,因此我使用自定义比较器来实现这一点。
struct sortPairSecond
{
bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs)
{
return lhs.second >= rhs.second;
}
};
代码在 DevCPP 中运行良好,但在使用 VS2010 的 xtree 上遇到调试断言失败。我做了一些调试,我意识到错误是由在自定义比较器中使用 >= 引起的,消除了 = 使代码工作但不正确的结果,因为我的程序中应该允许重复值。因此有人可以帮助我解决这个问题吗?
最佳答案
您使用 >=
而不是 >
可能无效,因为它需要严格排序,因此 op(a,b)
和op(b,a)
不能都为真(但如果它们相等则它们会为真)。
这只是一个断言错误,但是 set
不能包含重复值。只需使用排序的 vector
或者您可以使用 multiset
(并使用 '>')
当然,因为我们知道第一个值是唯一的,所以我们可以在第二个值等于第一个值时扩展谓词以比较第一个值。这将保证您的唯一值,然后您仍然可以使用 std::set
。
struct sortPairSecond
{
bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs) const
{
return (lhs.second > rhs.second) || (lhs.second == rhs.second && lhs.first > rhs.first) ;
}
};
从本质上讲,不要试图通过操纵谓词来“破坏”std::set
的用途。
关于c++ - C++ 设置比较器上的 Visual Studio 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13375885/