1

我的代码在我的 Visual Studio 2010 上存在一些问题,但在 DevCPP 上没有。继承人的情况,我在我的代码中使用 C++ STLset插入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 上遇到了 Debug Assertion Failed。我做了一些调试,我意识到错误是由在自定义比较器中使用 >= 引起的,消除 = 使代码工作但不正确的结果,因为在我的程序中应该允许重复值。因此,任何人都可以在这件事上帮助我吗?

4

1 回答 1

8

您的 using>=和 not>可能是无效的,因为它需要是严格的排序,因此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通过试图操纵您的谓词来“破坏”预期的用途。

于 2012-11-14T09:28:12.220 回答