在偏序上使用min_element

using min_element on partial order

本文关键字:min element 偏序      更新时间:2023-10-16

std::min_element(以及std::sort<algorithm>的类似函数)是否可以用于只有偏序的类型?

例如:

auto it = std::min_element(vec.cbegin(), vec.cend(), [](const node* a, const node* b) {
    return a->precedes(*b);
});

这里node表示DAG(有向无环图)中的节点,a.precedes(b)测试a是否是b的祖先。但是如果ab在不同的分支上,它也返回false,在这种情况下,返回a.precedes(b) == b.precedes(a) == false

Per §25.4/3(强调和脚注是我的):

用于25.4.3*中描述的算法以外的算法正确地说,comp**必须在值上诱导严格弱排序

* 25.4.3是关于二进制搜索算法的章节。
<子> <一口> * * comp自定义比较器。

由于std::sort是在25.4.1中定义的,而std::min_element是在25.4.7中定义的,那么你只需要对值进行严格弱排序,即:

术语strict指的是对非自反关系(!Comp (x, x)对于所有x),以及弱于需求的术语,这些需求不如全排序的需求强,但比部分排序的需求强。如果将equiv(a, b)定义为:comp(a, b) &&!comp(b, a),则要求comp和equiv都是传递关系:

(4.1) - comp(a, b) &&Comp (b, c)隐含Comp (a, c)

(4.2) - equiv(a, b) &&Equiv (b, c)暗含Equiv (a, c)

就我理解你的关系而言,它不匹配equiv要求,因为你可能有两个节点!comp(a, b) && !comp(b, a)a != b。通常情况下,如果在一个分支上有ac,而在另一个分支上有b,则上述操作将不起作用,因为equiv(a, b) == equiv(b, c) == trueequiv(a, c) == false .

来自c++ 11标准§23.2.1:

a < b转换为boollexicographical_-compare(a.begin(), a.end(), b.begin(), b.end()) pre[condition]: <是为T的值定义的。<是一个全排序关系。

不行