【发布时间】:2017-08-30 17:48:46
【问题描述】:
代码如下:
struct Payment
{
Payment(time_t time, float money) : mTime(time), mMoney(money) {}
bool operator==(const Payment& p) const // exact comparison
{
return mTime == p.mTime && mMoney == p.mMoney;
}
time_t mTime;
float mMoney;
};
std::vector<Payment> payments;
auto sortP = [](const Payment& p1, const Payment& p2) { return p1.mTime < p2.mTime || p1.mMoney <= p2.mMoney; };
std::sort(payments.begin(), payments.end(), sortP);
std::sort(并非总是如此,但有时,当两个元素彼此靠近的mTime 时)在 Visual Studio 2015 中引发无效的比较器断言。代码有什么问题?
【问题讨论】:
-
|| p1.mMoney <= p2.mMoney应该是|| ((p1.mTime == p2.mTime) && (p1.mMoney < p2.mMoney))否则当p1.mTime大于p2.mTime而p1.mMoney小于p2.Money时比较会出错。 -
比较两个浮点数不是一个好主意,浮点数没有精确表示,它们是近似值。您需要比较差异小于某个增量。出于同样的原因,将钱存入浮动资产并不是一个好主意。
-
@VTT:你说得对,这就是解决方案。把它作为一个答案,我会接受的。
-
一般来说,你不能使用
<=来进行严格的弱排序,因为它要求相等的元素为false。 -
@AndersK。在这种情况下,不需要 delta,除非 OP 使用该标准来查找元素。对于实际排序,它可能会使其变慢。