【问题标题】:When are two elements of an STL set considered identical?什么时候 STL 集合的两个元素被认为是相同的?
【发布时间】:2009-08-06 14:44:52
【问题描述】:

来自 cplusplus.com:

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

"Compare:比较类:接受两个与容器元素相同类型的参数并返回一个bool的类。表达式comp(a,b),其中comp是这个比较类的一个对象,a和b是容器的元素,如果在严格的弱排序操作中将 a 放置在比 b 更早的位置,则应返回 true。这可以是实现函数调用运算符的类或指向函数的指针(参见构造函数示例)。默认为 less,它返回的结果与应用小于运算符 (a&lt;b) 相同。 set 对象使用此表达式来确定元素在容器中的位置。集合容器中的所有元素始终按照此规则排序。”

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

我可以在这里想象两种方法:一种是在后台调用 (a == b),但不提供覆盖此比较的选项(与默认的 less&lt;Key&gt; 一样)似乎不太 STL-对我来说。另一个是假设 (a == b) == !(a

那么它到底是怎么做的呢?

【问题讨论】:

    标签: c++ stl set


    【解决方案1】:

    不是完全重复,但第一个答案 here 回答了您的问题

    你对行为的第二个猜测是正确的

    【讨论】:

      【解决方案2】:

      标准库中的关联容器是根据键的等价性定义的,而不是本身的等价性

      由于并非所有setmap 实例都使用less,但可能使用通用比较运算符,因此有必要根据这个比较函数定义等价,而不是尝试引入单独的等价概念。

      通常,使用比较函数 comp 的关联容器中的两个键(k1k2)是等效的,当且仅当:

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

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

      !(k1 < k2) && !(k2 < k1)
      

      【讨论】:

        【解决方案3】:

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

        std::set 需要部分排序,以便a&lt;b 隐含!(b&lt;a)。这不包括大多数二进制布尔仿函数。因此,我们可以讨论 a 和 b 在该顺序中的相对位置。如果a&lt;b,a 在 b 之前。如果 b&lt;a , b 在 a 之前。如果a&lt;bb&lt;a都不是,那么a和b在排序中占据相同的位置,因此是等价的。

        【讨论】:

          【解决方案4】:

          您的第二个选项是正确的。为什么感觉不对?如果等式检验与您给出的方程式不一致,您会怎么做?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多