c++ - C++ 设置比较器上的 Visual Studio 断言失败

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

最佳答案

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

相关文章:

vb.net - Visual Basic 循环永无止境

c++ - 在范围 for 循环的一个表达式中调用两个函数时出现段错误 C++

c++ - 绘制设备返回引擎 == 0,类型 : 1

c++ - 尝试使用外部 header 编译程序时出现问题

silverlight - 使用自定义URL参数启动VS2010 Silverlight调试 session

cvi - 如何检查 lib 文件?

python - 如何在2 2d列表中将第二列添加在一起?

c++ - 如何比较两个 Compare of two std::set

c++ - 两个字符的 Endian 安全转换为 unsigned short

c++ - 在 C++ 中将大于 5 位的数字除以 2 时会失去精度