如果这个问题很天真我很抱歉,但我似乎遇到了一些关于矢量push_back的问题。按照Stroustrup的书,我试图编写一个代码来确定素数[1,100]。到目前为止我写的所有内容似乎都有效,它正确地确定哪些是素数,但是当试图将素数推入向量时,它似乎没有推动所有值,或者这样做不正确
#include <iostream> // std::cout
#include <vector> // std::vector
using namespace std;
int prime(int num) {
for (int j = num-1; j >= 2; --j) {
if (num%j != 0) {}
else if (num%j == 0) return 1;
}
return 0;
}
int main() {
vector<int> found_primes;
int eval {0};
for (int i = 1; i <= 100; ++i) {
eval = prime(i);
if (eval > 0) {}
else if (eval == 0) found_primes.push_back(i); // I think the problem is here
}
for (int j : found_primes) {
cout << found_primes[j] << '\t';
}
}
提供输出:&#34; 2 3 5 11 17 31 41 59 67 83 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&#34;
我到底错过了什么?提前致谢。
答案 0 :(得分:1)
替换它:
for (int j : found_primes) {
cout << found_primes[j] << '\t';
}
有了这个:
for (int j : found_primes) {
cout << j << '\t';
}
粗略地说,基于语法的范围是一种更方便的迭代语法,它封装了迭代器的用法。因此,您只需在每次迭代时获取迭代器后面的元素,而不必使用迭代器。
旧样式是:
for (vector<int>::iterator it = found_primes.begin(); it != found_primes.end(); it++) {
cout << *it << '\t';
}
如果你愿意,你仍然可以这样做(理想情况下使用auto
而不是vector<int>::iterator
),但是,在某些情况下,迭代器可能会失效,而详细的语法会给你很多错误的机会,特别是如果你正在学习。
更多详情here。