我有这个模板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 ,同时, 它仍会保留模板结构,即不影响输入数组的情况是浮点数/双数组?
我可以单独实施每个案例,但是想知道是否有更好的方法来实现它。谢谢!
答案 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;
};