0

以前、2D 配列を使用したエラトステネスのふるいの実装について質問したところ、代わりにベクトルを使用するように言われた人が数人いました。唯一の問題は、C++ で Vector を使用する方法がわからなかったことです。

今日、2D 配列の代わりにベクトルを使用してプログラムを書き直しましたが、プログラムの終わり近くまでは非常にうまくいっていましたが、次のエラーが表示されました。

sieve.h: 関数 'void printPrimes(std::vector*, int)': sieve.h:42:20: エラー: 'operator<<' が 'std::cout << *(primes + ((unsigned int)(((unsigned int)i) * 12u)))'</p>

この種のエラー メッセージをこれまで受け取ったことがないため、これを修正する方法がわかりません。

これが私の修正されたコードです:

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;
    }
}

ふるい.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;
}
4

2 に答える 2

2

ループは次のようになります。

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

ただし、素数はベクトルへのポインターであるため、これは素数をベクトルの配列であるかのように扱っており、素数[i] を使用することで、ベクトルの配列内の i 番目のベクトルにアクセスしていますが、i 番目の要素にアクセスするつもりでした。関数に渡される単一のベクトルの。

これを修正するには、次のように変更します。

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

これに

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

今、素数はベクトルへの参照でありprimes[i]、そのベクトルの i 番目の要素であると言っています。

于 2013-09-25T02:08:20.390 に答える
0
void printPrimes(vector<int>* primes, int size)
{
int primearray[size];
for(int i = 0; i < size; i++)
    {
        cout<<(*primes)[i]<<endl;
    }
}

primesはポインターですが、値をベクトルで出力したいとします。* primesは素数が指すベクトルなので、解は *( primes)[i] です。

于 2013-09-25T02:21:46.770 に答える