C ++矢量匹配

时间:2014-05-25 11:22:01

标签: c++

我只是搞乱了矢量。在前两个循环中,我用数字1填充每个向量并跳转到下一个索引并执行相同的操作。在我的上一个循环中,我只计算包含数字1的索引数。为什么计数返回3而不是1?包含数字1的唯一索引应为零。

#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!? 
}

3 个答案:

答案 0 :(得分: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的索引为零。

答案 1 :(得分:0)

向量不是数组,这意味着推送的条目之间没有间隙。

在第一个向量中,您有6个条目,在第二个向量中,您有3个条目,前3个条目匹配,因此您得到3。

我希望当i变得超过向量中的元素数时,v1 [i]和v2 [i]会出错。

答案 2 :(得分:0)

您的代码会引发异常,因为v1在push_back循环后有7个项目 - 而v2有3个。

您无法访问v1[8]...v1[20]