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

0 c++ set visual-studio-2010 assertion

我的代码在我的Visual Studio 2010上有一些问题,但在DevCPP上却没有.在这种情况下,我set在我的代码中使用了C++ STL 来插入,pair<string, double>但后来我希望我set使用值而不是键对它们进行排序,所以我使用自定义比较器来实现这一点.

struct sortPairSecond
{
   bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs)
   {
    return lhs.second >= rhs.second;
   }
};
Run Code Online (Sandbox Code Playgroud)

代码在DevCPP中工作正常,但在使用VS2010的xtree上遇到调试断言失败.我做了一些调试,我发现错误是由自定义比较器中使用> =引起的,消除=使代码工作但结果不正确,因为我的程序中应该允许重复值.所以任何人都可以帮我解决这个问题?

Cas*_*Cow 7

您的使用>=,而不是>因为它需要有严格的排序因而可能是无效的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) ;
   }
};
Run Code Online (Sandbox Code Playgroud)

从本质上讲,不要试图std::set通过尝试操纵谓词来"破坏" 打算使用的内容.