使用模板函数

时间:2015-11-11 18:22:14

标签: c++ arrays templates integer

我有这个模板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; middle2 = 5; medianValue =(middle1 + middle2)/ 2 = 15/2 = 7.如何进行 round 而不是 floor ,同时, 它仍会保留模板结构,即不影响输入数组的情况是浮点数/双数组?

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

1 个答案:

答案 0 :(得分:1)

尝试(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;
};