创建前n个整数的std :: set的最有效方法是什么?

时间:2018-12-03 15:31:34

标签: c++

我正在尝试在c ++中创建一组n个整数,我想知道有没有比下面所示的简单for循环更有效的方法

setValue: boolean = true;
...
this.cvForm.patchValue({
  nested: {
    level1: {
      level2: {
        chekbox: setValue
      }
    }
  }
});

我尝试使用Google搜索,但是找不到任何答案。我觉得插入数字的递增性质应该导致更有效的实现。

4 个答案:

答案 0 :(得分:7)

如果您想提高效率,可以利用emplace_hint。如果应将要放置的值放置在提示之前,那么它将在恒定时间内发生,而不是FormGroup

log N

应为std::set indices; for (int i = 0; i < n; ++i) { indices.emplace_hint(indices.end(), i); } ,而不是O(N)

答案 1 :(得分:3)

可能没有一种更有效,没有。

std::generate(或者在这种情况下,更直接的说是std::iota)也可以做您想要的事情,但是从我的头顶上我看不到简单的{{ 1}}循环,至少在性能方面如此。

最终,无论您最终要做什么,都将需要使用这些值创建许多树节点,并且在某种程度上,计算机需要迭代以执行此操作。从这里进行预分配不会给您带来任何好处,因为该概念对于集合毫无意义(尽管这对向量是有效的建议)。

(编辑:我对此一无所知,但rodrigo指出插入提示可能会有所帮助。有趣的是,我听说某处如今的提示往往被忽略,但我不确定那是多么真实。 。)

最好的方法是尽量不要这样做。通常,如果您有一个 N 个连续整数的集合,则可以找到不需要它的方法,无论是通过一些神奇的数学运算还是至少通过仅根据需要生成所需的整数。我想每条规则都有例外。

答案 2 :(得分:3)

set::insert()有此过载:

iterator insert( iterator hint, const value_type& value );

提示是您认为应该插入值的位置。由于您的值已排序,因此您可以执行以下操作:

for (int i = 0; i < n; ++i){
    indices.insert(indices.end(), i);
}

并获得恒定的摊销时间,而不是每次插入的对数时间。

来自GCC docs

  

如果正确使用了提示,插入内容可能会从对数复杂度变为摊销固定时间。 [...]

     

如果提示参数[...]等效于:[...]

     
      
  • end(),则要插入的项的键应大于容器中的所有其他键。
  •   

答案 3 :(得分:1)

如果您是直接构建者,并且愿意使用Boost,可以选择counting_iterator

std::set<int> indices(boost::counting_iterator<int>(0), boost::counting_iterator<int>(n));