2014-05-25 132 views
-5

我只是搞亂矢量。在前兩個循環中,我使用數字1填充每個矢量,然後跳到下一個索引並執行相同的操作。在我的最後一個循環中,我只計算了包含數字1的索引數。爲什麼計數返回3而不是1?唯一包含數字1的指數應爲零。C++矢量匹配

#include <vector> 
#include <string> 
#include <iostream> 

using namespace std; 

int main() { 
vector <int> v1; 
vector <int> v2; 
int N = 20; 
int count = 0; 

for(int i = 0; i <= N; i+=3) { 
    v1.push_back(1); 
} 
for(int i = 0; i <= N; i+=7) { 
    v2.push_back(1); 
} 

for(int i = 0; i <= N; ++i) { 
    if(v1[i] == 1 && v2[i] == 1) count++; 
} 
cout << count; // returns 3. But why!? 
} 
+0

因爲你'1'印花布在你的向量,訪問' v1'超出索引'2'是未定義的行爲! –

回答

1

你的代碼有未定義行爲,因爲你正在訪問他們超越大小。在v1將會有7個項目,而在v2中,會有3個。但是你正在訪問兩個索引都是20.因此輸出可以是任何東西

要避免這種情況,您可以resize您的向量,然後將1分配給指定的索引。

v1.resize(N); // keep enough space 
v2.resize(N); 


for(int i = 0; i < N; i+=3) { 
v1[i]=1; 
} 
for(int i = 0; i < N; i+=7) { 
v2[i]=1; 
} 
for(int i = 0; i < N; ++i) { 
if(v1[i] == 1 && v2[i] == 1) count++; 
} 

另一個問題是,你的循環條件是i<=N,這應該是i<Nvector具有零基索引。

0

該向量不是一個數組,這意味着推送的條目之間沒有間隔。

在第一個向量,你有6項,在第二,你有3項,第3項匹配,這樣就可以獲得3

我預計V1 [i]和V2 [我]會給我一個錯誤,當我變得比向量中的元素數量更多。

+1

'operator []'不會進行邊界檢查,但有'v1.at(i)'如果您想要捕獲該錯誤 –

0

你的代碼拋出一個異常v1的循環的push_back後,有7個項目 - 而v2有3

您無法訪問v1[8]...v1[20]

+0

_'You code throws a exception'_ Not en ... –

+0

在我的機器上它總是拋出一個異常 – NirMH