答案 0 :(得分:7)
来自http://www.cplusplus.com/reference/stl/set/set/
vector<int> numbers;
for (int i=2; i<=2000000; ++i)
numbers.push_back(i);
set<int> primes(numbers.begin(), numbers.end());
那应该具有O(n)复杂度,而你的复杂度为O(n * log(n))。
引用的链接说明当你使用基于迭代器的构造函数时,如果迭代器被排序,那么你就会得到线性的。但是,我没有看到任何关于如何显式地通知构造函数它是一个已排序的迭代器的明确内容。
对于更清洁的东西,我宁愿使用boost的计数迭代器。这缩短为:
set<int> primes(
boost::counting_iterator<int>(0),
boost::counting_iterator<int>(200000));
答案 1 :(得分:4)
答案 2 :(得分:4)
如果您从候选int
的全部范围开始,我根本不会使用set
,我会使用vector<bool>
,将它们全部初始化为{{1} },并将目标(素数)标记为它们所在的false
。
true
您可以使用当前候选vector<bool> candidates(200000);
- 1(候选范围= 1..200000)对此进行索引。然后使用int
进行迭代以找到真实值,使用偏移量与find
转换为int
。
begin()
是一种特殊情况,请参阅@Greg Rogers的评论)vs&gt; = 800000 vector<bool>
,扣除BTree开销。答案 3 :(得分:2)