为什么在向量上迭代这么慢

Why is iterating over a vector so slow?

本文关键字:迭代 向量 为什么      更新时间:2023-10-16

我在做欧拉项目#7,你计算第1001个素数。我写了一个简单的函数来检查一个整数是否是素数:

bool isPrime(int p)
{
    if (p % 2 == 0 || p <= 1)
    {
        return false;
    }
    for (int i=3; i<=(int)sqrt((double)p)+1; i+=2)
    {
        if (p % i == 0)
        {
            return false;
        }
    }
    return true;
}

然后在主程序中,我从2开始,遍历所有后续的奇数,计算每个素数:

int count(1);
int i(1);
while (count != 10001)
{
    i += 2;
    if (isPrime(i))
    {
        count++;
    }
}
std::cout << "Answer: " << i << std::endl;

然后我认为我可以通过跟踪到目前为止找到的所有素数来改进这个函数,并将它们输入我的isPrime函数,如下所示:

bool isPrime(int p, std::vector<int> primes)
{
    if (p <= 1) 
    {
        return false;
    }
    for (std::vector<int>::iterator it=primes.begin(); it!=primes.end(); it++)
    {
        if (p % *it == 0)
        {
            return false;
        }
        else if (*it > (int)sqrt((double)p)+1)
        {
            return true;
        }
    }
    return true;
}

主程序改为:

int count(1);
int i(1);
std::vector<int> primes(1,2);
while (count != 10001)
{
    i += 2;
    if (isPrime(i, primes))
    {
        count++;
        primes.push_back(i);
    }
}
std::cout << "Answer: " << primes.back() << std::endl;

我的代码的第一个版本在不到一秒的时间内得到答案,而第二个版本花费了一分钟多的时间。我不明白为什么会这样,当然第二个版本应该更快,因为isPrime迭代的数字范围更小?如果有人能提供任何建议,谢谢。

您应该将isPrime()的签名改为

bool isPrime(int p, const std::vector<int>& primes)

避免每次调用函数时复制primes