gpt4 book ai didi

c++ - 如何消除 'Only index into arrays using constant expressions' 警告?

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:51 24 4
gpt4 key购买 nike

我写了一个kd-tree模板,它的参数是一个自然数K。

作为模板的一部分,我编写了以下函数来计算两点之间的距离(kd_point 是 std::array 的别名)

template <unsigned K>
float kd_tree<K>::DistanceSq(const kd_point &P, const kd_point &Q)
{
float Sum = 0;

for (unsigned i = 0; i < K; i++)
Sum += (P[i] - Q[i]) * (P[i] - Q[i]);

return Sum;
}

我打开了“启用 C++ 核心检查(发布)”,它给了我警告。有没有正确的方法来编写这个例程来消除警告?

最佳答案

由于您在评论中提到您的 kd_point 支持基于范围的迭代(所以我假设可以返回迭代器),您可以在没有原始循环的情况下重写函数。改用标准库中的命名算法:

template <unsigned K>
float kd_tree<K>::DistanceSq(const kd_point &P, const kd_point &Q)
{
return std::inner_product(
begin(P), end(P), begin(Q), 0.0f, std::plus<float>{},
[](float pi, float qi) {
return (pi - qi)*(pi - qi);
}
);
}

当然,标准库可以免除警告。如果(在这种情况下)用命名操作替换原始循环的边际 yield 对您没有吸引力,请考虑如果您使用支持 C++17 的编译器返回此代码,您将能够几乎毫不费力地将它并行化:

template <unsigned K>
float kd_tree<K>::DistanceSq(const kd_point &P, const kd_point &Q)
{
return std::transform_reduce(std::execution::par, // Parallel execution enabled
begin(P), end(P), begin(Q), 0.0f, std::plus<float>{},
[](float pi, float qi) {
return (pi - qi)*(pi - qi);
}
);
}

关于c++ - 如何消除 'Only index into arrays using constant expressions' 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47366755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com