C++ C++;矢量匹配
我只是在搞向量。在前两个循环中,我用数字1填充每个向量,然后跳到下一个索引,做同样的事情。在我的最后一个循环中,我只是在计算包含数字1的索引的数量。为什么计数返回3而不是1?唯一同时包含数字1的索引应为零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
#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)