可以避免范围最小重新计算吗

Lud*_*ert 5 c++ min minimization c++20 std-ranges

目标是在一定范围的输入值上最小化函数。性能很重要。不幸的是,该ranges::min()算法一遍又一遍地重新计算实时最优的输出。

看起来该算法可以缓存与最佳值相对应的输出值,或者我错过了什么?

在这个例子中,为什么f(x=0)需要调用n次呢?

#include <ranges>
#include <algorithm>
#include <stdio.h>
using namespace std;

int main()
{
    auto f=[](int x){
        printf("calling f(x=%d)\n", x);
        return x*x;
    };
    auto rg = views::iota(0,4);
    int x1 = ranges::min(rg, {}, f);
}
Run Code Online (Sandbox Code Playgroud)

它输出:

调用 f(x=0)
调用 f(x=1)
调用 f(x=0)
调用 f(x=2)
调用 f(x=0)
调用 f(x=3)

有没有ranges::min()更优化的调用方式?

Nic*_*las 5

可以ranges::min以某种方式实现,以便存储当前正在测试的投影对象吗?嗯,这会对这样的项目提出特定的要求。也就是说,您可以覆盖它(如果您找到较小的元素,以便可以将其缓存在同一变量中)。

目前这不是投影的要求;结果只需与比较函数进行比较即可。因此,强加这一点实际上会使预测更加严格。

现在,如果选择的话,允许实现缓存该值,因为投影函子需要是纯的。也就是说,如果它检测到投影中的值类型是可复制的,它就可以复制它。但这是实施质量的问题,而不是标准要求。