【发布时间】:2015-10-20 07:28:25
【问题描述】:
我写了一个简单的程序来生成素数。素数打印得很好。我还尝试将每个素数放入一个向量中以进行进一步处理,但不知何故,这些数字似乎并没有进入(即 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;
}
【问题讨论】:
-
NUM是如何定义的? -
你应该使用迭代器 (cplusplus.com/reference/vector/vector/begin) 来循环你的向量,这样你就不会越界。
-
您在“似乎行不通”的想法和发布到互联网之间省略了一个关键步骤:您没有证明这部分实际上 i> 是行不通的,通过将您的示例简化为只是那个特定部分。你会意识到
push_back()不是问题所在。这是一项必不可少的调试技能,也是我们要求minimal, complete, verifyable 示例的原因。如果您在发帖之前根本没有意识到自己的错误,它只会让回答变得容易得多。 -
除了越界访问(您可以通过将
bool arr[NUM] = { false };替换为std::vector<bool> arr( NUM, false );并将所有出现的[...]替换为范围检查.at(...)来验证自己)- - 我无法使用代码在 GCC 4.8 / Linux、GCC 4.9 / Cygwin 或 MSVC 2010 上重现您的输出。所有三个都产生预期的输出(2、3、5、7、11、13、17、19、23 , 29),而不是您发布的内容。投票结束。 -
代码仍然包含我指出的相同错误。
NUM+1在所有地方都需要替换为NUM。