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

标签 c++ dictionary comparison

我有一个整数类型,它表示环形缓冲区索引。 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。 我想在 map 中使用它作为键,但不确定它是否会导致问题。它具有非自反性和不对称性,但不具有传递性。

最佳答案

这会引起问题。正如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 ) 产量

关于c++ - std::map 的比较参数对于严格排序有什么要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40228164/

相关文章:

c++ - Cocos2d-x 3.0 - 新类的 DrawNode()

javascript - 使用 gmaps.js (谷歌地图 api )

JAVA,在treemap中想改变对象中的值?

python - 如何比较两个复杂的数据结构?

java - 确定两个 Java 对象是否属于同一类

django - 基于 django 中的比较进行过滤

c++ - 用 2 x 1 多米诺骨牌填充 3xN 瓷砖的方法数 (SPOJ : M3TILE)

c++ - 如何生成n位随机数?

c++ - MSVC 编译器错误 C2688 : Microsoft C++ ABI corner case issue?

java - 如何以相同的顺序遍历 SortedMap?