如何使用分治和迭代器添加所有向量元素
How to add all vector elements using divide and conquer and iterators?
我需要编写一个函数来汇总向量的所有元素。规范是它必须通过递归来完成,并且唯一的参数输入将是迭代器。函数应该:将向量一分为二,在左手边递归,在右手边递归,返回两边的和。我写了下面的代码,但我得到了一个错误的答案。
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 );
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 在 C++ 中输出枚举类类型的向量元素
- 用向量的向量元素初始化向量的空向量
- 为什么不允许使用可变长度数组作为向量元素?
- 在函数中传递向量元素
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- 返回向量元素的 l 值的正确方法是什么?
- 当向量增长时,指向向量元素的C++指针是否无效
- 如何在C++中从一个向量元素减去std::unorderede_map向量元素并更新它
- C++:向量元素赋值导致访问冲突
- 将向量元素与字符串元素进行比较,而不初始化向量
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 使用递归C++向量元素的总和
- 如何查找为数组中的最低值编制索引的向量元素
- 限制指针访问STL ::向量元素
- 访问索引指向向量元素时的seg故障 - 做错了什么
- 如何使用指针访问向量元素的各个元素
- 向量元素数据损坏了Find()操作
- 将字符值分配给向量元素.C