我看到一些旧的,非标准的equal_range的文档,它显式地调用了严格的弱排序(旧的SGI文档)和一些没有的新的标准equal_range(cppreference,libstdc ++ docs)。
函数是否已经改变,以至于它曾经需要严格的弱排序,现在需要......某种没有正确名称的分区?
答案 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)
! 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
的要求不是对谓词的一般要求,而是对谓词和特定值的特定要求。