2016-03-04 73 views
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,因爲某些原因累加功能不加入的10是在我的計數器向量索引11。有人能告訴我我在這裏做錯了嗎?謝謝!

+0

因爲'I = nCab'您嘗試在指數11訪問'VECTOR',當它的最大指數爲10,這是造成未定義的行爲。 – ppsz

+0

爲什麼要以相反的順序初始化?請注意,還有'std :: iota'來填充範圍越來越大的值。 – Jarod42

回答

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關閉。

+0

大聲笑。糟糕,菜鳥錯誤。我想我只需要另一雙眼睛。過去幾個小時一直編碼,只是錯過了我的循環中我的矢量指數。謝謝! –

1

您沒有索引11.您的向量中有11個元素,這意味着有效索引是[0, 10]counter[i] = i-1;是未定義的行爲,因爲您正在訪問一個超過向量末尾的行爲。

忽略你的載體實際上包含{0,0,1,2,3,4,5,6,7,8,9}這是45

注意UB:它不包含-1原因是用於循環運行的i > 0所以i將永遠0,我們將永遠不會設置的第一個元素的矢量,所以它仍然是0從矢量的構建。

1

正如其他人提到的,您正在訪問元素越界。

然而,而不是寫一個循環,並進入這種麻煩,你可以使用std::iota

#include <vector> 
#include <algorithm> 

int main() 
{ 
    int nCab = 11; 
    std::vector<int>counter(nCab); 
    std::iota(counter.begin(), counter.end(), 0); 
    //... 
} 

Live Example


如果由於某種原因,你真的想循環和填充數組在反向(高索引到低索引)時,可以使用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;}); 
    //... 
} 

Live Example (std::generate)