代码之家  ›  专栏  ›  技术社区  ›  suszterpatt

什么时候STL集合的两个元素被认为是相同的?

  •  1
  • suszterpatt  · 技术社区  · 17 年前

    从cplusplus.com:

    template < class Key, class Compare = less<Key>,
           class Allocator = allocator<Key> > class set;
    

    < b) 。 set对象使用此表达式确定元素在容器中的位置。集合容器中的所有元素始终按照此规则排序。”

    鉴于比较类用于确定两个对象中的哪一个“更小”或“更小”,该类如何检查两个元素是否相等(例如,防止两次插入同一元素)?

    我可以想象这里有两种方法:一种是在后台调用(a==b),但不提供覆盖此比较的选项(与默认值less相同) <Key> )对我来说似乎不太奇怪。另一个假设是(a==b)=!(a<b)及&!(b<a);也就是说,如果两个元素都不比另一个元素“少”,那么这两个元素就被认为是相等的,但考虑到比较可以是任意复杂类的对象之间的任意复杂布尔函子,我也觉得这不太对。

    那么它到底是如何做到的呢?

    4 回复  |  直到 17 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    不是完全相同,而是第一个答案 here 回答你的问题

        2
  •  3
  •   CB Bailey    17 年前

    标准库中的关联容器是根据 键的等价性 本质上

    并非全部 set 和 map 实例使用 less ,但可能会使用通用比较运算符。有必要根据这一比较函数定义等价性,而不是尝试引入单独的相等概念。

    一般来说,两个键( k1 和 k2 comp 当且仅当:

    comp( k1, k2 ) == false && comp( k2, k1 ) == false
    

    在容器中使用 std::less 对于没有特定std::less专门化的类型,这意味着:

    !(k1 < k2) && !(k2 < k1)
    
        3
  •  1
  •   MSalters    17 年前

    你的错误是假设“比较可以是任意复杂的布尔函子”。不可能。

    std::set 需要偏序,以便 a<b 暗示 !(b<a) . 这排除了大多数二元布尔函子。因此,我们可以讨论a和b在该顺序中的相对位置。如果 a<B ,a在b之前。如果 b<a ,b在a之前。如果两者都没有 也没有 ,则a和b在排序中占据相同的位置,因此是等效的。

        4
  •  0
  •   AProgrammer    17 年前