矢量push_back似乎正在推动不正确的值

时间:2017-05-28 20:58:52

标签: c++ vector push-back

如果这个问题很天真我很抱歉,但我似乎遇到了一些关于矢量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;

我到底错过了什么?提前致谢。

1 个答案:

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