如何使用除法和征服和迭代器添加所有向量元素?

时间:2015-03-07 00:58:40

标签: c++ recursion divide-and-conquer

我需要编写一个函数来总结向量的所有元素。规范是它必须通过递归来完成,唯一的参数输入是迭代器。该功能应该:将矢量分成两半,递归到左侧,递归到右侧,返回两侧的总和。我在下面编写了代码但得到了错误的答案。

int sumVectorRecurse(vector<int>::iterator left, vector<int>::iterator right)
{
    if (left != right){
        int midPosition = (right - left)/2;
        vector<int>::iterator mid = left + midPosition;
        return (sumVectorRecurse(left, mid) + sumVectorRecurse(mid+1, right));
    }
    else return *left;
}

int main(){

    vector<int> v = {1,2,3,4};
    cout << endl << "THIS IS QUESTION 4:"<< endl;
    cout << sumVectorRecurse(v.begin(), v.end());

}

更新:输出对于{1,2,3,4}的向量是可以的,但是一旦我向它添加5,使其{1,2,3,4,5}输出为“32782”

2 个答案:

答案 0 :(得分:4)

您正在取消引用end迭代器,这是未定义的行为。

按照惯例,C ++范围由一对迭代器指定,其中左迭代器指向第一个项目,右迭代器指向一个超过最后一个项目。这允许范围为空,具有begin == end

你的基本情况应该是:

if (left == right) return 0;
if (left + 1 == right) return *left;

然后,将mid传递给递归的两半,因为它将包含在后半部分(它是左迭代器)中,并在前半部分被排除(它是结束迭代器)

int sumVectorRecurse(vector<int>::iterator left, vector<int>::iterator right)
{
    if (left == right) return 0;
    if (left + 1 == right) return *left;
    int midPosition = (right - left)/2;
    vector<int>::iterator mid = left + midPosition;
    return sumVectorRecurse(left, mid) + sumVectorRecurse(mid, right);
}

答案 1 :(得分:1)

v.end() 是一个不可解决的迭代器。它代表了#34;结束了#34;。

这样可行。

sumVectorRecurse( v.begin(), v.end() - 1 );