【问题标题】:Using STL Sort within a template function?在模板函数中使用 STL 排序?
【发布时间】:2011-07-22 13:25:34
【问题描述】:

我试图创建一个模板函数,在蒙特卡洛模拟中进行一些加权采样。它在下面。 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];
}

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: c++ templates sorting stl


    【解决方案1】:

    如果您放入一个数组,则数组名称本质上是指向第一个元素的指针,而数组 name + x 是指向第 xth 元素的指针 - 所以这部分是正确的。

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

    您可以尝试通过提取取消引用的开始/结束元素的地址来进行排序 - 这可能让您将向量视为数组。

    【讨论】:

    • 谢谢。我必须以不同的方式处理向量。
    • 您永远不应将 STL 迭代器视为原始指针,否则您的代码可能会在某些实现上中断。
    • 我同意这个说法——尽管向量实现在标准中被定义为使用连续内存,所以用指针算法处理它们不应该产生问题。不过,对于 STL 容器,这绝对不是一个好的做法——尤其是因为迭代器可能会在使用过程中被容器操作无效。
    • 使用连续内存只是经典的实现,绝不是标准中的定义。
    • 哦,感谢您提供的信息 - 有人告诉我,曾经回复过一个帖子,我想我从来没有仔细检查过它:(
    【解决方案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)这似乎适用于动态和静态分配的数组,但不适用于 stl 向量。 (2) 如果我将参数列表更改为您建议的内容,当我退出函数时,数据是否仍会排序?我的印象是,如果我像这样按值传递,退出函数后数据将不会保持修改。这就是我首先使用参考的原因。
    • 第一个版本确实是为数组量身定做的,但第二个版本应该适用于任何具有随机访问的 STL 容器,因此包括向量。此外,您必须了解您通过值或引用传递的内容。按值传递指针时,传递的是指针的副本,而不是指向数组副本的指针。对于 STL 容器也是如此:当您按值传递迭代器时,您的函数会看到迭代器的副本,这让它与原始容器交互,而不是副本。
    【解决方案3】:
    sort(&input_data, &input_data + inputlength);
        ^^^          ^^^    
    

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

    【讨论】:

    • 你能详细说明一下吗?我尝试将数组的第一个元素作为参数传递给函数,但出现了很多错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多