在部分订单上使用min_element

时间:2016-06-28 08:43:13

标签: c++ graph stl-algorithm

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)测试ab的祖先。但如果ab位于不同的分支上,它也会返回false,在这种情况下会a.precedes(b) == b.precedes(a) == false

2 个答案:

答案 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。通常情况下,如果您在一个分支上有ac而在另一个分支上有b,则上述内容将无效,因为equiv(a, b) == equiv(b, c) == true只有equiv(a, c) == false

答案 1 :(得分:0)

来自C ++ 11标准§23.2.1:

  

a < b可转换为boollexicographical_-compare(a.begin(), a.end(), b.begin(), b.end())预[条件]:<是为T的值定义的。 <总排序关系。

所以,不,那不行。