在模板函数中使用STL排序?

时间:2011-07-22 13:25:35

标签: c++ templates sorting stl

我试图创建一个模板函数,在蒙特卡罗模拟中进行一些加权采样。它在下面。 input_data将是静态分配的数组(即data [33]),动态分配的数组或向量。

template <class myType>
int init_roulette_calcs(myType &input_data, int inputlength, int *(&output_cdf), int highclassix, int weight)
{
        sort(input_data, input_data + inputlength); //where the error occurs

        //other code:
        output_cdf = new int [inputlength];
        int k = 1;
    for (int i = 0; i < inputlength; i++)
    {
        output_cdf[i] = k;
        if (i+1 < highclassix) k++;
        else    k += weight;
    }
    return output_cdf[inputlength-1];
}

代码将无法编译,因为模板函数无法推断出对sort进行调用的参数。这可能是一个愚蠢的问题,但我需要做些什么来确保排序能够正常工作?

Error   4   error C2784: 'std::_Vb_iterator<_Alloc> std::operator 
+(_Alloc::difference_type,std::_Vb_iterator<_Alloc>)' : could not deduce template argument for 
'std::_Vb_iterator<_Alloc>' from 'int'  j:\rdm\lrgv_2011-07-21\lrgv_src\lrgv.h  398

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

在你的代码中,input_data是一个引用,但sort需要它作为指向数组开头的指针。它应该是:

int init_roulette_calcs(myType input_data[], int inputlength, …

虽然使用这样一个模板是正确的STL用法,但用户可以提供任何类型的随机访问开始和结束迭代器。因此,您可以稍后切换到矢量或任何其他可以处理的容器......

template <class InputIterator>
int init_roulette_calcs(InputIterator begin, InputIterator end, int *(&output_cdf), int highclassix, int weight)

答案 1 :(得分:2)

如果你放入一个数组,那么数组名实际上是指向第一个元素的指针,而数组name + xx元素的指针 - 所以你要正确使用这个部分。

问题是向量不是这种情况,这就是为什么你需要使用.begin().end()函数来获取指向这些位置的指针。

您可以尝试通过拉取解除引用的开始/结束元素的地址进行排序 - 这可能会让您将矢量视为与数组相同。

答案 2 :(得分:1)

sort(&input_data, &input_data + inputlength);
    ^^^          ^^^    

我希望你传递的参数实际上是对数组中第一个元素的引用。