【问题标题】:Visual Studio Assertion Failed on C++ set comparatorC++ 设置比较器上的 Visual Studio 断言失败
【发布时间】:2012-11-14 09:13:34
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您使用&gt;= 而不是&gt; 可能是无效的,因为它需要严格排序,因此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 的用途。

    【讨论】:

    • 绝对,>=是不允许的,应该是>。但请注意,即使在 std::multiset 中,您也应该使用 >.
    • 感谢您的回答。现在我的代码可以工作了,我已经意识到我最初的错误。无论如何,你有什么想法为什么代码在 DevCPP 上运行良好,但在 VS2010 上却不行?
    • DevCPP 没有检查断言,只是尝试排序,这在某些方面是关于它产生的“未定义”行为。 VS2010 会在发布版本上做同样的事情。
    • @CashCow 请原谅我,但我有一个后续问题。使用 DevCPP 编译的完全相同的代码大约需要 20 秒才能完成执行,但如果使用 VS2010 编译,大约需要 120 秒。是由于“未定义”行为还是有其他原因?
    • 这两种情况都需要很长时间,你的数据集一定很大。您正在使用哪些优化设置?你修复了谓词吗?
    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多