2014-05-25 105 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