为什么在向量上迭代这么慢
Why is iterating over a vector so slow?
我在做欧拉项目#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
相关文章:
- C++11 迭代向量的新方法?
- 迭代向量以获得搜索功能
- 为什么迭代向量在 c++ 中给出固定地址?
- 如何从向量映射中迭代向量
- 我怎样才能在不重复的情况下随机迭代向量的每个元素
- 是否有用于迭代向量的函数,而不管其类型如何?
- 您可以在一段时间内迭代向量
- 迭代向量向量中的第 i 行
- 指针的迭代向量会导致分段错误
- 使用一个迭代器迭代向量的向量
- 迭代向量时跳过行
- 迭代向量以更新word_counter
- 迭代向量中属性具有特定值的元素范围
- 在C++中迭代向量
- 在迭代向量的 for 循环中无效使用非静态数据成员
- 在C++中迭代向量
- 迭代向量时陷入无限循环的问题
- 迭代向量字符串的字符(C++禁止指针和整数之间的比较)
- 在 c++11 中,迭代向量的最现代、最"right"的方法是什么
- 5秒内迭代向量5