Использование вектора для решения решета Эратосфена с помощью C ++ и получение необычного сообщения об ошибке

Ранее сегодня я задал вопрос о реализации сита Эратосфена с двумерными массивами, и несколько человек посоветовали вместо этого использовать векторы. Единственная проблема в том, что я понятия не имел, как использовать векторы в C ++.

Сегодня я переписал свою программу, используя вектор вместо 2D-массива, и все шло хорошо до конца программы, когда я получаю следующую ошибку:

sieve.h: В функции 'void printPrimes (std :: vector *, int)': sieve.h: 42: 20: error: нет соответствия для 'operator ‹*' в 'std :: cout ‹* * (простые числа + ((целое число без знака) (((целое число без знака) i) * 12u))) '

Я никогда раньше не получал сообщения об ошибке такого типа, поэтому не знаю, как это исправить.

Вот мой исправленный код:

sieve.h

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <vector>
using namespace std;

vector<int> calc_primes(int);
void printPrimes(int[]);

vector<int> calc_primes(int max)
{
    vector<int> primes;

    for(int i = 2; i < max; i++)
    {
        primes.push_back(i);
    }

    // for each value in the vector
    for(int i = 0; i < primes.size(); i++)
    {
        //get the value
        int v = primes[i];

        if (v!=0) {
            //remove all multiples of the value
            int x = i+v;
            while(x < primes.size()) {
                primes[x]=0;
                x = x+v;
            }
        }
    }
    return primes;
}

void printPrimes(vector<int>* primes, int size)
{
int primearray[size];
for(int i = 0; i < size; i++)
    {
        cout<<primes[i]<<endl;
    }
}

sieve.cpp

#include "sieve.h"
using namespace std;

int main()
{
    int max;
    cout<<"Please enter the max amount of prime numbers:"<<endl;
    cin>>max;
    vector<int> primes = calc_primes(max);
    printPrimes(primes, max);
    return 0;
}

person Community    schedule 25.09.2013    source источник
comment
Я не думаю, что вам нужен заголовочный файл для этой маленькой программы ....   -  person StoryTeller - Unslander Monica    schedule 25.09.2013
comment
Ты прав. Мне он действительно не нужен. Просто приступить к практике - это все.   -  person    schedule 25.09.2013
comment
В этом случае вам следует практиковать лучшую технику. Не помещайте целые реализации в файлы заголовков. Используйте файлы заголовков только для обозначения функций.   -  person StoryTeller - Unslander Monica    schedule 25.09.2013


Ответы (2)


Ваш цикл выглядит так:

for(int i = 0; i < size; i++)
{
    cout<<primes[i]<<endl;
}

но поскольку простые числа являются указателем на вектор, это обрабатывает простые числа, как если бы они были массивом векторов, и с помощью primes [i] вы получаете доступ к i-му вектору в массиве векторов, тогда как вы имели в виду доступ к i-му элементу единственного вектора, который передается в функцию.

Чтобы исправить это, просто измените это:

void printPrimes(vector<int>* primes, int size)

к этому

void printPrimes(const vector<int> & primes, int size)

Теперь вы говорите, что простые числа - это ссылка на вектор, а primes[i] - это i-й элемент этого вектора.

person Vaughn Cato    schedule 25.09.2013
comment
Вы можете объяснить почему? - person ; 25.09.2013
comment
@MethosRaina: Я добавил несколько пояснений. Дайте мне знать, если это все еще непонятно. - person Vaughn Cato; 25.09.2013

void printPrimes(vector<int>* primes, int size)
{
int primearray[size];
for(int i = 0; i < size; i++)
    {
        cout<<(*primes)[i]<<endl;
    }
}

простые числа - это указатель, однако вы хотите распечатать значение в векторе. * простые числа - это вектор, на который указывают простые числа, поэтому решением будет * (простые числа) [i]

person YaleCheung    schedule 25.09.2013