我只是搞乱了矢量。在前两个循环中,我用数字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!?
}
答案 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<N
。 vector
的索引为零。
答案 1 :(得分:0)
向量不是数组,这意味着推送的条目之间没有间隙。
在第一个向量中,您有6个条目,在第二个向量中,您有3个条目,前3个条目匹配,因此您得到3。
我希望当i变得超过向量中的元素数时,v1 [i]和v2 [i]会出错。
答案 2 :(得分:0)
您的代码会引发异常,因为v1
在push_back循环后有7个项目 - 而v2
有3个。
您无法访问v1[8]...v1[20]