c++进阶:Compare

关系是有序对的集合

  • 关系可能具有的性质定义

以下均假设R是集合A上的二元关系:

  1. 自反性 ,如果对于A中的每个元素x,都有 属于R,则称R具有自反性。
  2. 反自反性(irreflexivity) ,如果对于A中每个元素x,都有不属于R,则称R具有反自反性。
  3. 对称性,如果对于R中的每个有序对都有对应的有序对也属于关系R,则称R具有对称性。
  4. 反对称性,如果对于R中的每个有序对,且也属于关系R,那么x == y一定成立,则称R具有反对称性。注意:有些关系既是对称的,又是反对称的,如相等关系;有些关系是对称的,但不是反对称的,如Z中的“绝对值相等”;有些关系是反对称的,但不是对称的,如Z中的≤和<;还有的关系既不是对称的,又不是反对称的。
  5. 传递性 对于A中的元素x, y, z, 如果属于R并且属于R,那么就属于R,则称R具有传递性。
  • 偏序集(partical order)

设R是集合A上的一个关系,如果R是自反的、反对称的和可传递的,则称R是集合A的偏序关系,简称偏序,记作“≤”。这里的符号不仅仅指我们之前学过的具体符号,而是偏序的符号,当然小于等于号(对应的关系)本身是典型的偏序关系。
一般将一个集合A和定义在其上的偏序关系R一起称为偏序集。
wiki定义:https://en.wikipedia.org/wiki/Partially_ordered_set#Strict_and_non-strict_partial_orders
对于集合A中的元素x和y而言,如果有序对或者属于偏序关系R,则称x和y是可比较的(comparable),否则称x和y是不可比较的(incomparable)。如果集合A中的任意两个元素之间是可比较的,则称偏序关系R为全序关系(total order)。

  • 全序集(total order)

对于一个偏序集A,R,如果对于A中的任意两个元素x和y,有序对至少有一个属于关系R,则称R为序关系,A和R一起称为全序集合/有序集。和上面的定义本质上是一样的。

举例:一个偏序集而不是全序集的例子,集合的包含关系,两个集合间可能是不可比较的。

  • 严格和非严格偏序关系(strict and non-strict partial orders)

上述定义的偏序集可以认为是非严格的,主要是为了与下面的严格偏序集做对比:
一个严格偏序关系需要具有如下性质:
反自反性,传递性和反对称性。记作小于号符号,和上面的定义类似,这里仅作为一个符号使用,当然我们熟悉的小于号对应的关系是典型的严格偏序关系。

  • 严格的弱序关系(strict weak orderings)

如果一个严格偏序集(集合A与定义在集合A上的严格偏序关系R)的关系R满足:如果A上的元素x,y,z,x和y是不可比较的,y和z是不可比较的,则x和z是不可比较的。那么称这样的关系为严格弱序关系,也就是说具有可传递的不可比较性。

  • 等价关系(equivalence relation)

一个等价关系应该具有如下性质:
自反性,传递性,对称性。
注意到,严格弱序集上的不可比较的关系(incomparability relation)是一种等价关系。 // 个人猜测,官方说法很模糊。
证明:
//注意理解,不可比较关系是依附于某个关系定义的,即是关系的关系。
//自反性:x和x是不可比较的,因为严格弱序是反自反的,所以!(xRx) && !(xRx)为真。
//传递性:!(xRy) && !(yRx)为真,!(yRz) && !(zRy)为真,则由于严格弱序关系的额外性质,即可传递的不可比较性,因此!(xRz) && !(zRx)为真,不可比较关系是传递的
//对称性:!(xRy) && !(yRx)为真,则由于逻辑运算左右两侧交换不影响结果,因此不可比较关系是对称的。
所以说严格弱序关系的定义保证了定义在其上的不可比较关系是等价关系。
wiki : https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings


以上是前导知识,现在看下今天要说的c++中的一个concept:Compare。这个concept在c++的标准库中广泛涉及并使用,例如关联容器set和map中,算法sort中等等,url : https://en.cppreference.com/w/cpp/named_req/Compare
具体的requirements见上链接即可,总的来说就是满足Compare的类的对象是一个函数对象,等同于关系,其两个参数等同于元素,这个关系应该是一个严格弱序关系。

注意标准中的这句话:Note: comp induces a strict total ordering on the equivalence classes determined by equiv
这个严格弱序关系在equiv定义的等价类上是一个严格全序关系
//equiv就是上文中的不可比较关系(也是等价关系),原集合可以被划分为不同的等价类,每个等价类是一个子集合,该集合中的元素两两等价。
这其实很好理解,只要x和y来自不同的等价类,那么或者至少有一个属于严格弱序关系的集合--因为根据定义都不属于的话x和y肯定在一个等价类中。

因此,当你为map和set以及可重复版本提供自定义类型的key时,以及对自定义类型的对象进行sort排序时(无论使用默认版本还是提供比较函数,因为默认版本最终还是要调用operator<)都要注意,你定义的关系需要满足严格弱序关系。


之后会举一个例子说明,这种情况并不少见,而且有时候比较复杂和隐晦。

你可能感兴趣的:(c++,stl)