【问题标题】:CPP vector concatenation in recursive function递归函数中的 CPP 向量连接
【发布时间】:2020-12-13 10:24:33
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c++ vector c++14 concatenation


    【解决方案1】:

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

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

    newVec.insert(newVec.end(), rightSubArray.begin(), rightSubArray.end());
    return newVec;
    

    您也需要为您的其他退货声明做类似的事情。

    【讨论】:

    • 没错。我这样做了,但即便如此,我愚蠢的代码编辑器仍然显示错误,而我应该再次编译。谢谢它有效。
    • @wr93_ 没问题。一般来说,不要依赖你的编辑器给你错误。 c++ 是一种难以解析的语言,你应该把它留给编译器:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多