如何使用分治和迭代器添加所有向量元素

How to add all vector elements using divide and conquer and iterators?

本文关键字:向量 元素 添加 迭代器 何使用 分治      更新时间:2023-10-16

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

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"

您正在取消引用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);
}

v.end()而不是可取消引用的迭代器。它代表"一个过去的结束"。

这会奏效的。

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