C++ C++;矢量匹配

C++ C++;矢量匹配,c++,C++,我只是在搞向量。在前两个循环中,我用数字1填充每个向量,然后跳到下一个索引,做同样的事情。在我的最后一个循环中,我只是在计算包含数字1的索引的数量。为什么计数返回3而不是1?唯一同时包含数字1的索引应为零 #include <vector> #include <string> #include <iostream> using namespace std; int main() { vector <int> v1; vector <int

我只是在搞向量。在前两个循环中,我用数字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!? 
}
#包括
#包括
#包括
使用名称空间std;
int main(){
向量v1;
矢量v2;
int N=20;
整数计数=0;

对于(int i=0;i您的代码具有未定义的行为,因为您正在访问它们,超出了其大小。在
v1
中,将有7个项目,而在
v2
中,将有3个项目。但您正在访问索引20的两个项目。因此,输出可以是任何内容

为了避免这种情况,您可以调整向量的大小,然后将
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++;
}
v1.调整大小(N);//保持足够的空间
v2.调整大小(N);
对于(int i=0;i

另一个问题是循环条件是
i向量不是数组,这意味着推送的条目之间没有间隙

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


当I超过向量中的元素数时,我希望v1[I]和v2[I]会给出一个错误。

您的代码会抛出一个异常,因为在push_-back循环之后,
v1
有7个项目,而
v2
有3个项目


你不能访问
v1[8]…v1[20]

,因为你的向量中到处都是
1
,访问
v1
超过
2
的索引是未定义的行为,尽管你的代码抛出异常“不一定……至少在我的机器上它总是抛出异常
操作符[]
不执行边界检查,但如果您想捕获该错误,则有
v1.at(i)