我有三个随机访问迭代器parent
,child1
和child2
,它们指向置换数组中的某些值。 (上下文:我正在实现heapsort;那些迭代器包含二进制子树)。
我需要确定迭代器,它具有最大的引用值(以维护堆的max-heap属性)。因此,如果*parent
是最大的,则返回parent
,如果*child1
是最大的,则返回child1
等。
伪代码:
#include <algorithm>
auto iterator = std::max({ parent, child1, child2 });
iterator
现在是迭代器,其基础值是最大的。
问题是使用这个文字伪代码,std::max
会在这里比较迭代器 selfself ,而不是它们的引用值。我可以std::max({ *parent, *child1, *child2 })
,但它会返回decltype(*parent)
,那么如何从那里获得迭代器?
我知道使用一些if
s很简单,但是不是有更优雅的方法吗?标准库有什么东西吗?我尝试了几件事,但它们看起来都很笨重而且不方便。
答案 0 :(得分:3)
如果你不认为std::max
使用自定义比较器,那么它就是:
auto iterator = std::max({ parent, child1, child2 },
[](auto it_a, auto it_b) { return *it_a < *it_b; });
答案 1 :(得分:2)
std::max
接受比较函数对象:
auto iterator = std::max({ parent, child1, child2 },
[](const auto& a, const auto& b){
return *a < *b;
});
尽管如此,您可能更愿意重构一些可重复使用的功能部件:
template<class Fun>
auto indirect_args(Fun&& fun = {}) {
return [fun = std::forward<Fun>(fun)](auto&&... args) {
std::forward<decltype(fun)>(fun)(
*std::forward<decltype(args)>(args)...);
};
}
auto iterator = std::max({ parent, child1, child2 },
indirect_args<std::less<decltype(parent)>>();
});
答案 2 :(得分:2)
由于std::max
对自定义比较器有重载,你可以这样做:
auto cmp = [](auto lhs, auto rhs){ return *lhs < *rhs; };
auto iterator = std::max({ parent, child1, child2 }, cmp);