我给了整数15、16、17、18、19和20。
我应该只将可被4整除的数字放入向量中,然后在向量中显示值。
我知道如何使用数组解决问题,但是我猜我不知道如何正确使用推回或向量。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> arrmain; int i,j;
for (int i = 15; i <=20 ; i++)
{
//checking which numbers are divisible by 4
if (i%4 == 0)
{ //if number is divisible by 4 inserting them into arrmain
arrmain.push_back(i);
//output the elements in the vector
for(j=0; j<=arrmain.size(); j++)
{
cout <<arrmain[i]<< " "<<endl;
}
}
}
return 0;
}
想要的输出:可被4:16、20整除的数字
答案 0 :(得分:1)
代码中的主要问题是:(1)在打印矢量的值时使用了错误的变量来索引矢量,即,您使用cout <<arrmain[i]
而不是cout <<arrmain[j]
; (2)迭代到j <= arrmain.size()
时超出数组范围(而不是j < arrmain.size()
。请注意,arrmain[arrmain.size()]
超出了向量范围,因为向量索引是从0开始的;向量例如,大小为5的有效索引的范围为0..4
,而5
超出范围。
一个小问题是您在填充阵列时一次又一次地打印阵列的内容。您可能希望在第一个循环之后打印一次,而不是在其中一次又一次地打印。
int main()
{
vector<int> arrmain;
for (int i = 15; i <=20 ; i++)
{
//checking which numbers are divisible by 4
if (i%4 == 0)
{ //if number is divisible by 4 inserting them into arrmain
arrmain.push_back(i);
}
}
//output the elements in the vector
for(int j=0; j<arrmain.size(); j++)
{
cout <<arrmain[j]<< " "<<endl;
}
return 0;
}
关于注释中提到的基于范围的for循环,请注意,您可以使用以下缩写语法对向量的元素进行迭代:
// could also be written as range-based for loop:
for(auto val : arrmain) {
cout << val << " "<<endl;
}
此语法称为基于范围的for循环,例如,here at cppreference.com中对此进行了描述。
答案 1 :(得分:1)
正如注释中已经提到的那样,您的代码中有两个问题。
编写更多代码时,所有这些最终都会咬住您。
编译器工具可以告诉您很多信息。例如,使用-Weverything
in clang。
选择最重要的内容:
source.cpp:8:10:警告:声明遮盖了局部变量[-Wshadow]
for(int i = 15; i <= 20; i ++)
和
source.cpp:6:26:警告:未使用的变量'i'[-Wunused-variable]
向量arrmain; int i,j;
除此之外,您的代码中还有一个逻辑问题:
for values to check
if value is ok
print all known correct values
运行时结果为:16、16、20。 相反,您想更改打印范围,以使其不会在每次匹配时都打印。
最后,您看到的错误:
for(j=0; j<=arrmain.size(); j++)
{
cout <<arrmain[i]<< " "<<endl;
}
此错误是命名错误的结果,让我重命名,以便您看到问题所在:
for(innercounter=0; innercounter<=arrmain.size(); innercounter++)
{
cout <<arrmain[outercounter]<< " "<<endl;
}
现在,应该很清楚,您使用了错误的变量来为向量建立索引。在最大大小为2的向量中,这将是索引16和20。由于这些索引超出向量的范围,因此您具有未定义的行为。使用正确的索引时,<=
还会使您使用向量<
来使向量超出1个索引。
除了为变量使用更好的名称外,我建议使用基于范围的。从C ++ 11开始可用。
for (int value : arrmain)
{
cout << value << " "<<endl;
}
答案 2 :(得分:0)
运行代码后,我发现了两个错误,这些错误已在下面的代码中修复。
vector<int> arrmain; int i, j;
for (int i = 15; i <= 20; i++)
{
//checking which numbers are divisible by 4
if (i % 4 == 0)
{ //if number is divisible by 4 inserting them into arrmain
arrmain.push_back(i);
//output the elements in the vector
for (j = 0; j < arrmain.size(); j++) // should be < instead of <=
{
cout << arrmain[j] << " " << endl; // j instead of i
}
}
}
此代码将输出:16 16 20,因为您在每次插入操作后都打印矢量元素。您可以将第二个循环带到外面,以避免重复操作。
基本上,矢量用于处理动态大小更改。因此,如果要动态增加向量的大小,则可以使用push_back();如果大小已经预先定义,则可以使用[] operator。