std :: equal_range是否需要严格的弱排序?

时间:2016-01-31 20:32:46

标签: c++ stl partitioning

我看到一些旧的,非标准的equal_range的文档,它显式地调用了严格的弱排序(旧的SGI文档)和一些没有的新的标准equal_range(cppreference,libstdc ++ docs)。

函数是否已经改变,以至于它曾经需要严格的弱排序,现在需要......某种没有正确名称的分区?

1 个答案:

答案 0 :(得分:4)

std::equal_range要求所检查的序列必须由表达式pr(value, N)pr(N, value) 分区,其中pr是谓词,{{ 1}}是您要查找相等范围的值,value是序列的元素。

对于序列,这是一个较弱的条件,而不是要求序列必须以严格的弱顺序排序。它只需要有一个分区点P,其中N为P之前的序列中的所有元素N返回pr(N, value)true为所有元素返回pr(value, N) false之后或之后的序列。例如,序列[2,1,5,4]由P和值<分区,分区点在元素值为5。

对于谓词本身,3需要与equal_range不对称,即value对所有N序列都隐含pr(N, value)。特别是,这意味着! pr(value, N)可以返回pr(X, X),而严格的弱排序不是这种情况。严格弱排序的要求/属性是:

  • 不对称:true暗示pr(x, y)
  • irreflexivity:! pr(y, x)
  • 及物性:pr(x, x) == false暗示pr(x, y) && pr(y, z)
  • pr(x, z)暗示! pr(x, y) && ! pr(y, z)(在编程元素中,这是通过另外的等价关系表示的)

请注意,这些点适用于序列的所有元素x,y。然而,! pr(x, z)pr的要求不是对谓词的一般要求,而是对谓词和特定值的特定要求。