向量不会推回整数

时间:2015-10-20 07:28:26

标签: c++ vector

我写了一个简单的程序来生成素数。素数印得很好。我还试图将每个素数放在一个向量中以便进一步处理,但不知何故,数字似乎进入(即push_back)向量,因为它打印出奇数而不是素数。简而言之,整个程序工作正常,只有向量有问题。请帮忙。

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

const int NUM = 300;

int main()
{
    int i, j ;
    int counter = 0;
    bool arr[NUM] = {false}; //false == 0
    vector<int> aVector;

    ...


    cout << "\nNumber of prime numbers is " << counter << endl;

    for (j=0; j<aVector.size() ; j++)
    {
        cout << "aVector[" << j << "] is " << aVector[j] << endl;
    }

   return 0;
}

3 个答案:

答案 0 :(得分:6)

您的代码访问超出arr的范围。数组在C ++中是零索引的。

for (i = 2; i<=NUM; i++)应该是:for (i = 2; i<NUM; i++)

for (j = 1; j <= NUM/i; j++)应该是:for (j = 1; j * i < NUM; j++)

应用这些修补程序后,您的代码为appears to work for me。我删除了if (i支票,因为它是多余的。

答案 1 :(得分:3)

正如M.M指出的那样,在代码中的许多地方,您试图从arr数组的边界之外获取和设置值。这是C ++中未定义的行为。一旦调用未定义的行为可能发生任何 - 整个程序(不仅包含错误的行)的行为是不可预测的。在静态数组边界外写入通常会导致覆盖其他变量。

看起来您的程序会覆盖aVector的内部数据,将其指针替换为动态分配的数组。难怪它打印“随机垃圾” - 矢量现在认为它的内容位于内存中的不同位置。

根据经验:Simple C [] arrays are evil,请改用矢量:
vector<bool> arr(NUM, false)。要访问元素,请使用:arr.at(some_index)。如果some_index超出向量边界,则会抛出异常。请注意,即使您使用向量,arr[some_index]也不会执行边界检查,因此也会导致未定义的行为。

答案 2 :(得分:2)

这是一个简单的快速修复。循环到向量的末尾。

for (j=0; j<aVector.size() && j < 6; j++){
        cout << "aVector[" << j << "] is " << aVector[j] << endl;
}

------------------------我试过的完整代码

#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>

using namespace std;
#define NUM 100
int main()
{
    int i, j ;
    int counter = 0;
    bool arr[NUM] = {false}; //false == 1
    vector<int> aVector;

    for (i = 2; i<=NUM; i++)
    {
        if (arr[i] == 0)
        {
            cout << setw(6) << i ; //i is a prime number

            /****doesn't seem to work****/
            aVector.push_back(i);  //fill the vector with prime numbers
            counter++;

            if (i <= NUM/2)
            {
                for (j = 1; j <= NUM/i; j++)
                {
                    arr[i*j] = 1;
                }
            }
        }
    }
    cout << "\nNumber of prime numbers is " << counter << endl;

    /*** it prints out strange numbers ******/
    for (j=0; j<aVector.size() && j < 6 ; j++){
        cout << "aVector[" << j << "] is " << aVector.at(j) << endl;
    }

    return 0;
}