C++ Visual Studio断言在C++;设定比较器

C++ Visual Studio断言在C++;设定比较器,c++,visual-studio-2010,set,assertion,C++,Visual Studio 2010,Set,Assertion,我的代码在VisualStudio2010上有一些问题,但在DevCPP上没有。在我的代码中,我使用C++ STL SET/COD>来插入配对>代码>,但是我希望我的 SET/CODE >使用值而不是键对它们进行排序,所以我使用自定义比较器来实现这一点。 struct sortPairSecond { bool operator()(const pair<string, double> &lhs, const pair<string, double> &a

我的代码在VisualStudio2010上有一些问题,但在DevCPP上没有。在我的代码中,我使用C++ STL <代码> SET/COD>来插入<代码>配对>代码>,但是我希望我的<代码> SET/CODE >使用值而不是键对它们进行排序,所以我使用自定义比较器来实现这一点。
struct sortPairSecond
{
   bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs)
   {
    return lhs.second >= rhs.second;
   }
};
struct sortPairSecond
{
布尔运算符()(常数对和lhs、常数对和rhs)
{
返回lhs.second>=rhs.second;
}
};

代码在DevCPP中运行良好,但在使用VS2010的xtree上遇到调试断言失败。我做了一些调试,我意识到错误是由在自定义比较器中使用>=引起的,消除了=使代码正常工作,但在我的程序中应该允许不正确的结果作为重复值。因此,任何人都可以在这件事上帮助我吗?

你使用
=
而不是
可能是无效的,因为它需要严格的顺序,因此
op(a,b)
op(b,a)
不能都是真的(但如果它们相等的话)

这只是一个断言错误,但是
集合
不能包含重复的值。只需使用排序的
向量
,也可以使用
多集
(并使用“>”)

当然,因为我们知道第一个值是唯一的,所以当第二个值等于比较第一个值时,我们可以扩展谓词。这将保证您的值是唯一的,然后您仍然可以使用
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) ;
   }
};
struct sortPairSecond
{
布尔运算符()
{
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秒。这是由于“未定义”的行为还是有其他原因?在这两种情况下都需要很长时间,您的数据集必须非常大。您使用的优化设置是什么?你修好谓词了吗?