簡體   English   中英

std :: vector(InputIterator是第一個,InputIterator是最后的)線性時間復雜度?

[英]Is std::vector(InputIterator first, InputIterator last) linear time complexity?

我想使用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);
}

std::vector(InputIterator first, InputIterator last)線性時間復雜度?

簡而言之,是的。

該標准保證了vector(InputIterator, InputIterator)的以下內容:

復雜性:僅對N的復制構造函數進行N次調用(其中N是第一個和最后一個之間的距離) ,如果迭代器的第一個和最后一個是正向,雙向或隨機訪問類別,則不進行重新分配 它使命令N調用T的復制構造函數和命令log(N)重新分配,如果它們只是輸入迭代器。

基本上,對於正向,雙向或隨機訪問迭代器,您不應期望在第二個示例中使用reserve()看到任何性能提升; 構造函數會自動為您執行此操作。

對於普通的輸入迭代器, reserve()會加快速度,但不會超過常量因子。 log(n)重新分配仍將在O(n)總時間內完成,因此構造向量的總時間也將是O(n)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM