我编写了一个模板函数来确定任何类型的矢量或数组的中位数,可以使用 sort 进行排序。该功能和一个小测试程序如下:
#include <algorithm>
#include <vector>
#include <iostream>
using namespace::std;
template <class T, class X>
void median(T vec, size_t size, X& ret)
{
sort(vec, vec + size);
size_t mid = size/2;
ret = size % 2 == 0 ? (vec[mid] + vec[mid-1]) / 2 : vec[mid];
}
int main()
{
vector<double> v;
v.push_back(2); v.push_back(8);
v.push_back(7); v.push_back(4);
v.push_back(9);
double a[5] = {2, 8, 7, 4, 9};
double r;
median(v.begin(), v.size(), r);
cout << r << endl;
median(a, 5, r);
cout << r << endl;
return 0;
}
如您所见,中位数函数将指针作为参数 T vec 。在参数列表中还有一个参考变量 X ret ,它由函数修改以存储计算出的中值。
但是我发现这不是一个非常优雅的解决方案。 T vec 将始终指向与 X ret 相同类型的指针。我最初尝试写中位数有一个像这样的标题:
template<class T>
T median(T *vec, size_t size)
{
sort(vec, vec + size);
size_t mid = size/2;
return size % 2 == 0 ? (vec[mid] + vec[mid-1]) / 2 : vec[mid];
}
我也尝试过:
template<class T, class X>
X median(T vec, size_t size)
{
sort(vec, vec + size);
size_t mid = size/2;
return size % 2 == 0 ? (vec[mid] + vec[mid-1]) / 2 : vec[mid];
}
我无法让其中任何一个工作。我的问题是,有人能告诉我其中任何一种替代方案的工作实施吗?
感谢您的期待!
答案 0 :(得分:3)
惯用法是使用迭代器。要启用此功能,可以从迭代器派生返回类型:
template <class I>
typename iterator_traits<I>::value_type median(I start, I finish)
{
...
}
答案 1 :(得分:0)
我会这样做:
template <class T>
void median( T* vec, size_t size, T& ret )
{
sort( vec, vec + size );
size_t mid = size/2;
ret = size % 2 == 0 ? ( vec[mid] + vec[mid-1] ) / 2 : vec[mid];
}
template <class T>
void median( vector<T>& vec, T& ret )
{
median( &*vec.begin(), vec.size(), ret );
}
但那只是我。