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
。
答案 0 :(得分:1)
Per§25.4/ 3(强调和脚注是我的):
对于除25.4.3 * 中描述的算法之外的算法 正确地说,comp ** 必须在值上引入严格弱排序。
* 25.4.3是二进制搜索算法的部分。
** comp
是自定义比较器。
由于std::sort
在25.4.1中定义且std::min_element
在25.4.7中,因此您只需对值进行严格弱排序,即:
术语严格是指对所有x的反自由关系的要求(!comp(x,x)),对于要求的弱项要求不如总排序强,但强于部分订购。如果我们将equiv(a,b)定义为!comp(a,b)&amp;&amp; !comp(b,a),那么要求是comp和equiv都是传递关系:
(4.1) - comp(a,b)&amp;&amp; comp(b,c)表示comp(a,c)
(4.2) - equiv(a,b)&amp;&amp; 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
。
答案 1 :(得分:0)
来自C ++ 11标准§23.2.1:
a < b
可转换为bool
。lexicographical_-compare(a.begin(), a.end(), b.begin(), b.end())
预[条件]:<
是为T
的值定义的。<
是总排序关系。
所以,不,那不行。