在迭代器上检索最大值

时间:2017-01-30 11:31:00

标签: c++ c++-standard-library heapsort

我有三个随机访问迭代器parentchild1child2,它们指向置换数组中的某些值。 (上下文:我正在实现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很简单,但是不是有更优雅的方法吗?标准库有什么东西吗?我尝试了几件事,但它们看起来都很笨重而且不方便。

3 个答案:

答案 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);