Visual Studio断言在C ++ set comparator上失败

时间:2012-11-14 09:13:35

标签: c++ visual-studio-2010 set assertion

我的代码在我的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上遇到调试断言失败。我做了一些调试,我意识到错误是由于在自定义比较器中使用&gt; =,消除=使代码工作但不正确的结果,因为我的程序中应该允许重复值。因此,任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:7)

您使用>=而非>可能无效,因为它必须是严格的排序,因此op(a,b)op(b,a)不能同时为真(但如果他们是平等的。)

这只是一个断言错误,但set不能包含重复值。只需使用已排序的vector,或者您可以使用multiset(并使用'&gt;')

当然,我们知道第一个值是唯一的,我们可以在第二个值等于比较第一个值时扩展谓词。这将保证您的唯一值,然后您仍然可以使用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的用途。