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
的祖先。但是如果a
和b
在不同的分支上,它也返回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
。通常情况下,如果在一个分支上有a
和c
,而在另一个分支上有b
,则上述操作将不起作用,因为equiv(a, b) == equiv(b, c) == true
但equiv(a, c) == false
.
来自c++ 11标准§23.2.1:
a < b
转换为bool
。lexicographical_-compare(a.begin(), a.end(), b.begin(), b.end())
pre[condition]:<
是为T
的值定义的。<
是一个全排序关系。
不行