2017-01-30 3 views
1

私は3つのランダムアクセスイテレータparent,child1、およびchild2を持っています。これらは、並べ替えられた配列の特定の値を指しています。 (コンテキスト:私はheapsortを実装しています;それらのイテレータはバイナリサブツリーを構成します)。イテレータで最大値を取得

(ヒープの最大ヒーププロパティを維持するために)最も大きな参照値を持つイテレータを決定する必要があります。

#include <algorithm> 

auto iterator = std::max({ parent, child1, child2 }); 

iteratorは今根本的な価値が最大でイテレータです:*parentが最も大きいのであれば、など

擬似コード、child1返し、*child1が最大である場合、parentを返します。

問題は、このリテラルの擬似コードを使用して、std::maxはない、ここでイテレータに彼らの参照値をitsselfを比較するだろうということです。私はstd::max({ *parent, *child1, *child2 })を行うことができましたが、それはdecltype(*parent)を返すので、どのようにそこからイテレータを取得するのですか?

ifを使用して実現可能であることはわかっていますが、もう少しエレガントな方法はありませんか?標準ライブラリには何かがありますか?私はいくつかのことを試みましたが、それらはすべてかさばっていて不便でした。

答えて

3

あなたがかさばるカスタムコンパレータとstd::maxを考慮していない場合は、ここにある:あなたが好むかもしれ、が

auto iterator = std::max({ parent, child1, child2 }, 
         [](const auto& a, const auto& b){ 
    return *a < *b; 
}); 

auto iterator = std::max({ parent, child1, child2 }, 
         [](auto it_a, auto it_b) { return *it_a < *it_b; }); 
2

std::maxは、比較関数オブジェクトを受け入れ一部の再利用可能な機能部品にリファクタリングする:

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

std::maxは、カスタムコンパレータの過負荷を持っているので、あなたができる:

auto cmp = [](auto lhs, auto rhs){ return *lhs < *rhs; }; 
auto iterator = std::max({ parent, child1, child2 }, cmp); 
関連する問題