将可被数字整除的数字插入向量

时间:2019-04-27 17:36:45

标签: c++ vector

我给了整数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整除的数字

3 个答案:

答案 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。