有关严格排序的std :: map的比较参数有哪些要求?

时间:2016-10-24 21:56:06

标签: c++ dictionary comparison

我有一个整数类型,它代表一个环形缓冲区索引。以这种方式定义的比较函数越少:

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。 我想在地图中使用它作为关键,但不确定它是否会导致问题。它具有反射性和不对称性,但不具有传递性。

1 个答案:

答案 0 :(得分:2)

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

  • cmp(a,a)收益false
  • 如果cmp(a,b)为真,则cmp(b,a)会产生false
  • 如果cmp(a,b) == truecmp(b,c) == true,那么cmp(a,c)也必须是true(这将无法满足你的比较器)
  • 如果ab要比较相等,那么cmp(a,b)cmp(b,a)都会产生false