これが、コードレビューから私にもたらされたタスクです。特別な種類の比較述語に基づいて、セットから最小値を選択したいと考えています。このような:
struct Complex { ... };
float calcReduction(Complex elem);
Complex findMinValueWithPredicates(const std::vector<Complex>& values)
{
auto it = std::min_element(values.begin(), values.end(),
[](const Complex& a, const Complex& b) {
return calcReduction(a) < calcReduction(b);
});
if (it == values.end()) throw std::runtime_error("");
return *it;
}
ここでは、述語に基づいて最小要素を見つけます。この述語は、両方の値の削減float
を計算し、それらの float を比較します。うまく機能し、きれいに見えます。
問題が見えますか?はい、N
要素のセットは時間calcReduction()
と呼ばれますが、要素ごとに1回2N
だけ計算するだけで十分です。N
この問題を解決する 1 つの方法は、明示的な計算を記述することです。
Complex findMinValueExplicit(const std::vector<Complex>& values)
{
float minReduction = std::numeric_limits<float>::max();
Complex minValue;
for (Complex value : values)
{
float reduction = calcReduction(value);
if (reduction < minReduction)
{
minReduction = reduction;
minValue = value;
}
}
if (minReduction == std::numeric_limits<float>::max()) throw std::runtime_error("");
return minValue;
}
N
正常に動作し、への呼び出ししかありませんcalcReduction()
。ただし、 の明示的な呼び出しと比較して、あまりにも冗長に見え、意図が明確ではありませんmin_element
。呼び出すmin_element
と、最小限の要素を見つけることができると簡単に推測できるからです。
私が今持っている唯一のアイデアはmin_element_with_reduction
、範囲と縮小関数を受け入れるような独自のアルゴリズムを作成することです。合理的に聞こえますが、すぐに使える解決策があるかどうか疑問に思います。
明確な意図といくつかの準備が整ったソリューションでこのタスクを解決する方法についてのアイデアはありますか? ブースト大歓迎です。C++17 と範囲は興味深いものです。