在偏序上使用min_element
using min_element on partial order
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
的值定义的。<
是一个全排序关系。
不行
- 如何使用std::min和std::less返回对象
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 关于 std::min, std::max 中的比较运算符的混淆
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 为什么将 1 添加到 numeric_limits<float>::min() 返回 1?
- 如何将 bsoncxx::d ocument::element 写入控制台
- 在儿童的特定情况下,向下渗透MIN二进制堆失败
- 在f2c.h文件中定义min()max()宏时出错
- 如何解决g++问题"internal compiler error: Illegal instruction min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MI
- 第 5 行:字符 54:错误:调用"min(int,std::__cxx11::basic_string<char>::size_type)"没有匹配函数
- 如何使用函数std::min()来计算最小值
- 在函数 'int main(int, char**) 中,没有声明 'MIN'
- 将迭代器值与 std::min 一起固定到 end()
- C++是否在 std::min 和 std::max 下标准化 std::optional 的行为?
- [bsoncxx ]如何附加一个bsoncxx::d ocument::element TO bsoncxx::buil
- c++ 中 std::min 的效率
- 当摆脱模偏差时,min = -upper_bound % upper_bound; // 如何工作?
- std :: min-设计考虑
- 如何在 OpenACC 中并行化内部具有"min"功能的循环
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错