用模板函数计算中值

Calculate median value with template function

我有这个模板 getMedian() 函数,其中允许任何数据类型。详细功能如下。

template<typename T>
T getMedian(T* inputArray, int arraySize)
{
    unique_ptr<T[]> sortArray(new T[arraySize]);
    copy(inputArray, inputArray + arraySize, sortArray.get());

    T medianValue;
    if (arraySize % 2)
    {
        nth_element(sortArray.get(), sortArray.get() + arraySize / 2, sortArray.get() + arraySize);
        medianValue = *(sortArray.get() + arraySize / 2);
    }
    else
    {
        nth_element(sortArray.get(), sortArray.get() + arraySize / 2, sortArray.get() + arraySize);
        T middle1 = *(sortArray.get() + arraySize / 2);
        nth_element(sortArray.get(), sortArray.get() + arraySize / 2 - 1, sortArray.get() + arraySize);
        T middle2 = *(sortArray.get() + arraySize / 2 - 1);
        medianValue = (middle1 + middle2) / 2;
    }
    return medianValue;
}

如果输入数组是整数数组,数组大小是偶数数,中位数应该是中间两个数的平均值。对应的代码是

medianValue = (middle1 + middle2) / 2;

但是,在 C++ 中,整数除法会截断为最接近的小数(floor),而不是四舍五入。例如,middle1 = 10;中间 2 = 5; medianValue = (middle1 + middle2) / 2 = 15 / 2 = 7。我怎样才能做到 round 而不是 floor,同时,仍会保持模板结构,即不影响输入数组为float/double数组的情况?

我可以单独实现每个案例,但想看看是否有更好的方法。谢谢!

尝试(T)round((middle1 + middle2) / 2.0);

除法 2.0 会将表达式转换为 double。之后调用 round 将正确舍入它。然后结果将被转换为 T.

编辑:

如果浮点值是可能的,再添加一个用于计算中位数的模板函数:

template<typename T>
T median(T middle1, T middle2) {
    return (T)round((middle1 + middle2) / 2.0);
};

template<>
float median(float middle1, float middle2) {
    return (middle1 + middle2) / 2.0F;
};

template<>
double median(double middle1, double middle2) {
    return (middle1 + middle2) / 2.0;
};