累积没有给出我的向量的正确总和

Accumulate not giving correct sum of my vector

本文关键字:向量 我的      更新时间:2023-10-16

我有这个问题:

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 .