以前、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;
}