STL Set:以最有效的方式插入200万个有序数字

时间:2010-10-19 17:23:17

标签: c++ stl insert set

4 个答案:

答案 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

  • 内存分配总数 - 1.
  • 总内存使用量25000字节(begin()是一种特殊情况,请参阅@Greg Rogers的评论)vs&gt; = 800000 vector<bool>,扣除BTree开销。
  • 所有元素访问都是通过指针算法。

答案 3 :(得分:2)