std::map 的比较参数对严格排序有什么要求?

What are the requirements of std::map's compare parameter regarding strict ordering?

本文关键字:排序 什么 map 比较 参数 std      更新时间:2023-10-16

我有一个整型,它表示一个环缓冲区索引。less比较函数定义如下:

friend bool operator < (const CircularValue & lhs, const CircularValue &rhs) {
    UInt max = lhs.value + std::numeric_limits<UInt>::max() / 2;
    return (lhs.value < max)
        ? rhs.value > lhs.value && rhs.value < max
        : rhs.value > lhs.value || rhs.value < max;
}
如果rhs发生在Lhs以上的一半可用间隔内,则认为

Lhs低于rhs。我想在地图中使用它作为关键,但不确定它是否会导致问题。它具有非自反性和非对称性,但不具有及物性。

这会引起问题。如cppreference所述,比较器必须满足以下要求:

  • cmp(a,a)产率false
  • 如果cmp(a,b)生成true,则cmp(b,a)生成false
  • 如果cmp(a,b) == truecmp(b,c) == true,那么cmp(a,c)也必须是true(这不会被比较器满足)
  • 如果ab比较相等,则cmp(a,b)cmp(b,a)都产生false