使用模板计算向量的平均值

Calculating average of vectors using templates

本文关键字:向量 平均值 计算      更新时间:2023-10-16

我制作了一个简单的功能,该功能采用2个 std::array,并返回另一个 std::array,其中 std::arrayss。

中值的平均值
template<typename T, std::size_t N>
std::array<T, N> average(const std::array<T, N>& a1, const std::array<T, N>& a2)
{
    std::array<T, N> array;
    for (std::size_t i = 0; i < N; ++i)
        array[i] = (a1[i] + a2[i]) / 2;
    return array;
}

效果完美。现在,我想计算 n 向量的平均值。所以我做了这个

template<typename T, std::size_t N, typename... Ts>
std::array<T, N> average(const Ts&... args)
{
    std::array<T, N> result;
    for (std::size_t i = 0; i < N; ++i)
    {
        T addedValues = 0;
        for (const auto& array : { args... })
            addedValues += array[i];
        result[i] = addedValues / sizeof...(args);
    }
    return result;
}

也有效,但我必须指定结果模板参数

std::array<int, 3> a{ 1, 2, 3 };
std::array<int, 3> b{ 3, 4, 5 };
auto c = average<int, 3>(a, b); //'<int, 3>' not good, possible without?

我想不出其他方式,有人可以帮我吗?

提供了您还将对模板功能正文进行必要的更改。您可以如下更改模板功能的签名:

template<typename T, std::size_t N, typename... Ts>
std::array<T, N> average(std::array<T, N> const &arr, const Ts&... args)

这样,您不必明确指定模板参数,并且模板参数扣除将推断TN,因此您可以将average模板函数称为:

std::array<int, 3> a{ 1, 2, 3 };
std::array<int, 3> b{ 3, 4, 5 };
auto c = average(a, b);