累积没有给出我的向量的正确总和
Accumulate not giving correct sum of my vector
我有这个问题:
int nCab = 11;
int nCabCombo;
std::vector<int>counter(nCab);
for(int i = nCab; i > 0; i--)
{
counter[i] = i-1;
std::cout<<counter[i]<<std::endl;
}
nCabCombo = std::accumulate(counter.begin(),counter.end(),0);
std::cout<<nCabCombo<<std::endl;
nCabCombo 的输出是 45,而它应该是 55,由于某种原因,累加函数没有将我的计数器向量索引 11 处的 10 相加。有人可以告诉我我在这里做错了什么吗?谢谢!
您没有索引 11。 你的向量中有 11 个元素,这意味着有效的索引是[0, 10]
的。 counter[i] = i-1;
是未定义的行为,因为您正在访问一个超过向量末尾的行为。
忽略您的向量实际包含的 UB {0,0,1,2,3,4,5,6,7,8,9}
即 45
注意:它不包含-1
的原因是 for 循环运行了 i > 0
因此i
永远不会0
,我们永远不会设置向量的第一个元素,因此它与向量的构造保持0
。
正如其他人提到的,您正在越界访问该元素。
但是,与其编写循环并陷入这种麻烦,不如使用 std::iota:
#include <vector>
#include <algorithm>
int main()
{
int nCab = 11;
std::vector<int>counter(nCab);
std::iota(counter.begin(), counter.end(), 0);
//...
}
现场示例
如果出于某种原因,您真的想反向循环和填充数组(高索引到低索引),则可以使用 std::generate 并使用反向迭代器:
#include <vector>
#include <algorithm>
int main()
{
int nCab = 11;
std::vector<int>counter(nCab);
int i = 11;
std::generate(counter.rbegin(), counter.rend(), [&i] {return --i;});
//...
}
实时示例(标准::生成)
counter[i] = i-1; //when i == 11, this is an off by one error
数组和扩展向量的范围从 [0, size)
.如果它有 nCab
个元素,则最大索引仅为 nCab - 1
。您将最后一个元素存储在向量边界之外。您应该将其更改为:
counter[i - 1] = i-1;
缺少的元素本来是 10
.当accumulate
运行时,这就是为什么您的总和相差 10
.
相关文章:
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 我可以做些什么来改进指针向量中的此搜索?
- 防止我的向量在调用它的函数结束时被删除
- 所有shared_ptr都指向我的向量中的同一指针
- 在我为我的二维向量提供第一个值后控制台关闭
- 在不同条件下无法访问我的向量变量
- 为什么我的最终向量是它应该大小的两倍并且具有前导 0?
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 当我使用我的向量名称后跟包含整数变量的括号时,括号是什么意思
- 我可以在不循环访问数组/向量的情况下检查数组/向量中的单词吗?
- 是一个std ::向量线程,我的目的是安全的
- 试图创建一系列向量(我创建的模板化向量类)
- 为什么我的代码没有将每个对象添加到向量中
- 为什么我的向量函数的返回值总是 1
- 为什么我的将向量保存到文件然后再次读出的方法不起作用?
- 我的内部循环XML在C 向量中的预期无法正常使用Write_xml
- 如何为我的自定义向量类实现类似 vector.insert 的方法