返回向量的递归c ++

时间:2017-08-08 00:25:17

标签: javascript c++ recursion vector

嘿伙计们我正试图将这个javascript代码改为c ++。我正在快速排序,一切都是直接的,减去最后一步。

function quickSort(arr)
{
    //base case if the arr is 1 or 0 then return the array
    if(arr.length === 1 || arr.length === 0)
    {
        return arr;
    }


    var pivotIndex = Math.floor(arr.length/2);
    var pivotValue = arr[pivotIndex];

    var before = [];
    var after = [];

    for(var counter = 0; counter < arr.length; counter++)
    {
        if(counter === pivotIndex)
            continue;
        if(pivotValue <= arr[counter])
        {
            before.push(arr[counter])
        }
        else
        {
            after.push(arr[counter])
        }
    }
//this step I am having trouble rewriting in c++
    return quickSort(after).concat(pivotValue).concat(quickSort(before));

}

我很难重写c ++中的递归步骤。我不确定如何连续2矢量。我尝试使用insert方法但是我一直收到有关无效使用void表达式的错误。

vector<int> quickSort(vector<int> arr)
{
    if(arr.size() == 1 || arr.size()  == 0)
    {
        return  arr;
    }

    int pivotIndex = arr.size()/2;
    int pivotValue = arr[pivotIndex];

    vector<int> before;
    vector<int> after;


    //put values in before or after the piv
    for(size_t counter = 0; counter < arr.size(); counter++)
    {
        if(counter == pivotIndex)
            continue;
        if(pivotValue <= arr[counter])
            before.push_back( arr[counter]);
        else
            after.push_back( arr[counter]);
    }

   return //????? not sure how to do this

}

2 个答案:

答案 0 :(得分:1)

所以,你意识到你的核心问题是&#34;如何连接两个vector s&#34;,你找到了right answer: using insert。现在你的问题是你为什么得到关于无效使用void表达式的错误。&#34; (这是我的答案的假设,至少。)

那是因为您可能会尝试执行以下操作:

return quickSort(after).insert( /* stuff */ );

这是错误的。在JavaScript中,array.concat 返回连接数组。它的返回类型实际上是Array,因此return arr.concat(arr2)返回Array,因为arr.concat会返回Array。此外,在JavaScript中,array.concat不会修改它所调用的数组,而是返回一个新数组。

但是,在C ++中, vector.insert (#4 in the reference) returns void。这意味着它什么都不返回。因此,当您尝试返回insert的结果时,您会收到有关无效使用void表达式的错误。此外,在C ++中,vector.insert 修改它被调用的vector

那么在这种情况下如何使用insert?

vector<int> quickSort(vector<int> arr)
{
    // ...

    // Sort `before` and `after`
    before = quickSort(before);
    after = quickSort(after);

    // Modify `after` and return it.
    after.push_back(pivotValue);
    after.insert(after.end(), before.begin(), before.end());
    return after;
}

注意:我的代码不是最优的,在C ++中重写JS的想法也很奇怪。我的回答是简单地概述问题中提出的问题,不提供快速排序的良好C ++实现

答案 1 :(得分:0)

要连接两个向量,可以使用std :: merge 像:std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dst));