繁体   English   中英

在函数模板中使用类型参数和指向相同类型参数的指针

[英]Using a type parameter and a pointer to the same type parameter in a function template

我已经写了一个模板函数来确定可以用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];
 }

我无法让其中任何一个正常工作。 我的问题是,任何人都可以向我展示我的替代方案的有效实现吗?

感谢您的光临!

惯用的方法是使用迭代器。 为此,可以从迭代器派生返回类型:

template <class I>
typename iterator_traits<I>::value_type median(I start, I finish)
{
    ...
}

我会这样做:

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 );
}

但这就是我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM