C++: “invalid comparator” 断言

标签 c++ c++11 stl

<分区>

代码如下:

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 中引发无效的比较器断言。有什么问题代码?
enter image description here

最佳答案

问题出在 sortP 的实现上。它不满足严格的弱排序标准。在 https://www.boost.org/sgi/stl/StrictWeakOrdering.html 阅读详细信息.

我建议进行以下更改:

auto sortP = [](const Payment& p1, const Payment& p2)
{
   // Order by mTime if they are not equal.
   if ( p1.mTime != p2.mTime)
   {
     return p1.mTime < p2.mTime;
   }

   // Otherwise, order by pMoney
   return ( p1.mMoney < p2.mMoney); // Use < not <=
};

您可以使用 std::tie使实现更简单。

auto sortP = [](const Payment& p1, const Payment& p2)
{
   return std::tie(p1.mTime, p1.mMoney) < std::tie(p2.mTime, p2.mMoney);
};

关于C++: “invalid comparator” 断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45966807/

相关文章:

c++ - 如何添加标准和用户定义的对象?

c++ - 在 Windows 10 上使用 Clang 和 LLD

c++ - noexcept 指定函数不抛出的条件

c++ - 用户提供的 terminate() 函数必须是线程安全的吗?

c++ - STL 实现之间分配策略的差异?

c++ - 为什么在 C++ 中将较大函数中的某些功能编写为 lambda?

c++ - 使用枚举编译时多态性

c++ - 使用 bitset 和共享静态数组将 std::set 专门用于 (u)int8 和 chars 是否合法

c++ - 用于单个生产者单个消费者 FIFO 的 STL 容器?

c++ - 通过 printf 函数打印带有 %u 说明符的 unsigned char 是否安全?