std :: vector(InputIterator是第一个,InputIterator是最后的)线性时间复杂度?

时间:2013-03-20 17:14:45

标签: c++ boost constructor time-complexity stdvector

我想使用C ++ std::vector输入迭代器构造函数来构建一个连续整数数组,如下所示:

std::vector<unsigned> indexes(boost::counting_iterator<unsigned>(0U),
                              boost::counting_iterator<unsigned>(10000U));

但是,我想知道它是否具有与迭代器之间的距离成比例的时间复杂度,或者是否由于重复调整大小以使向量增长而能够具有额外的对数分量?换句话说,构造函数是否会查看两个迭代器之间的距离?由于构造函数参数不是随机访问迭代器,我不确定距离是否可以计算?

如果它会反复调整大小,是否有更好的解决方案来避免这种情况:

std::vector<unsigned> indexes;

indexes.reserve(10000U);

for (unsigned idx = 0; idx < 10000U; ++idx) {
  indexes.push_back(idx);
}

1 个答案:

答案 0 :(得分:4)

  

std::vector(InputIterator first, InputIterator last)线性时间复杂度是什么?

简而言之,是的。

该标准保证了§23.3.6.2中vector(InputIterator, InputIterator)的以下内容:

  

复杂性:仅对N的复制构造函数进行N次调用(其中N是第一个之间的距离)   如果迭代器的第一个和最后一个是前向,双向或随机访问,那么并且没有重新分配   类别即可。它使命令N调用T的复制构造函数和命令log(N)重新分配(如果它们)   只是输入迭代器。

基本上,对于正向,双向或随机访问迭代器,您不应期望在第二个示例中使用reserve()看到任何性能提升;构造函数会自动为您执行此操作。

对于普通输入迭代器,reserve()会加快速度,但不会超过常数因子。 log(n)重新分配仍将在O(n)总时间内完成,因此构建向量的总时间也将为O(n)