1

我有这个问题:

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。有人可以告诉我我在这里做错了什么吗?谢谢!

4

3 回答 3

1

正如其他人所提到的,您正在越界访问元素。

但是,您可以使用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;});
    //...
}

现场示例(std::generate)

于 2016-03-04T18:11:19.800 回答
1

您没有索引 11。向量中有 11 个元素,这意味着有效索引是[0, 10]. counter[i] = i-1;是未定义的行为,因为您正在访问向量末尾的一个。

忽略您的向量实际包含的 UB {0,0,1,2,3,4,5,6,7,8,9},即 45

注意:它不包含 a 的原因-1是 for 循环运行 fori > 0所以i永远不会0,我们永远不会设置向量的第一个元素,因此它保留0在向量的构造中。

于 2016-03-04T17:48:56.347 回答
0
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.

于 2016-03-04T17:47:33.203 回答