递归函数中的 CPP 向量串联

Wag*_*CDR 0 c++ vector concatenation c++14

我有这个递归函数,它不会编译在向量连接行给出错误。

    vector<int> binaryInsert(vector<int> subArray, int subArraySize, int nextVal) {
    if(subArraySize == 1)
    {
        if(nextVal >= subArray[0]) subArray.insert(subArray.begin()+1, nextVal);
        else subArray.insert(subArray.begin(), nextVal);
        return subArray;
    }
    else if(subArraySize == 2)
    {
        if(nextVal >= subArray[0]) {
            if(nextVal >= subArray[1]) subArray.insert(subArray.begin()+2, nextVal);
            else subArray.insert(subArray.begin()+1, nextVal);
        }
        else subArray.insert(subArray.begin(), nextVal);
        return subArray;
    }
    else
    {
        if(subArraySize%2 == 1)
        {
            int halfPoint = (subArraySize-1)/2;
            vector<int> leftSubArray(subArray.begin(), subArray.begin()+halfPoint);
            vector<int> rightSubArray(subArray.begin()+halfPoint, subArray.end());
            vector<int> newVec;
            if(nextVal <= leftSubArray[halfPoint-1]) {
                newVec = binaryInsert(leftSubArray, halfPoint, nextVal);
                return newVec.insert(newVec.end(), rightSubArray.begin(), rightSubArray.end());
            }
            else
            {
                newVec = binaryInsert(rightSubArray, halfPoint+1, nextVal);
                return leftSubArray.insert(leftSubArray.end(), newVec.begin(), newVec.end());
            }
            
        }
        else
        {
            int halfPoint = (subArraySize)/2;
            vector<int> leftSubArray(subArray.begin(), subArray.begin()+halfPoint);
            vector<int> rightSubArray(subArray.begin()+halfPoint, subArray.end());
            vector<int> newVec;
            if(nextVal <= leftSubArray[halfPoint-1]) {
                newVec = binaryInsert(leftSubArray, halfPoint, nextVal);
                return newVec.insert(newVec.end(), rightSubArray.begin(), rightSubArray.end());
            }
            else
            {
                newVec = binaryInsert(rightSubArray, halfPoint, nextVal);
                return leftSubArray.insert(leftSubArray.end(), newVec.begin(), newVec.end());
            }
        }      
    }  
}
Run Code Online (Sandbox Code Playgroud)

该行return newVec.insert(newVec.end(), rightSubArray.begin(), rightSubArray.end()); 给出了以下错误。

无法转换 'newVec.std::vector::insert<__gnu_cxx::__normal_iterator<int*, std::vector > >(__gnu_cxx::__normal_iterator<const int*, std::vector >(newVec.std::vector ::end()), rightSubArray.std::vector::begin(), rightSubArray.std::vector::end()' 来自 'std::vector::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector >}' 到 'std::vector'

也一样return leftSubArray.insert(leftSubArray.end(), newVec.begin(), newVec.end());

我确信我用于矢量连接的方法是最可靠和更好的方法,但我无法弄清楚导致错误的原因。我在这里做的有什么问题吗?

cig*_*ien 5

调用std::vector::insert返回一个iterator而不是修改后的vector。因此 return 语句将尝试将 an 转换iterator为 a vector,从而给出您看到的编译器错误。

您可以通过简单地将 return 语句分成 2 行来解决这个问题:

newVec.insert(newVec.end(), rightSubArray.begin(), rightSubArray.end());
return newVec;
Run Code Online (Sandbox Code Playgroud)

您也需要对其他 return 语句执行类似的操作。