今天之前,我问了一个关于使用二维数组实现埃拉托色尼筛法的问题,一些人告诉我改用 vector 。唯一的问题是我不知道如何在 C++ 中使用 vector 。
我今天使用 vector 而不是二维数组重写了我的程序,它运行得非常好,直到程序快结束时,我收到以下错误:
sieve.h: In function ‘void printPrimes(std::vector*, int)’: sieve.h:42:20: error: no match for ‘operator<<’ in ‘std::cout << *(primes + ((unsigned int)(((unsigned int)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;
}
最佳答案
你的循环看起来像这样:
for(int i = 0; i < size; i++)
{
cout<<primes[i]<<endl;
}
但是因为 primes 是一个指向 vector 的指针,所以这将把 primes 当作一个 vector 数组来处理,并且通过使用 primes[i] 你正在访问 vector 数组中的第 i 个 vector ,而你打算访问传递给函数的单个 vector 的第 i 个元素。
要修复它,只需更改它:
void printPrimes(vector<int>* primes, int size)
对此
void printPrimes(const vector<int> & primes, int size)
现在你是说 primes 是一个 vector 的引用,然后 primes[i]
就是那个 vector 的第 i 个元素。
关于c++ - 使用 vector 用 C++ 求解埃拉托色尼筛法并收到异常错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18995025/