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;ベクトルの終わりを過ぎてアクセスしているため、未定義の動作です。

ベクトルに実際に含ま{0,0,1,2,3,4,5,6,7,8,9}れる 45 であるUB を無視する

注: a が含まれていない理由-1は、for ループが実行されるi > 0ためです。ベクトルの最初の要素を設定することは決してないため、ベクトルの構築から残りiます。00

于 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 に答える