[英]forward_list: assign(_InputIterator __first, _InputIterator __last) / assign(size_type __n, const _Tp& __val)
[英]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.