用模板函数计算中值
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;
};
我有这个模板 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;
};