簡體   English   中英

C ++中向量初始化的性能

[英]Performance of vector initialization in C++

假設您從另一個容器初始化向量:

main()
{
    list<int> L { 0, 1, 2 };
    vector<int> V ( L.begin(), L.end() );
    copy ( V.begin(), V.end(), ostream_iterator<int> ( cout, " " ) );
    cout << endl;
}

向量大小是否設置一次,還是在初始化期間動態調整大小? (由於源中元素很少,因此在此示例中不成問題,但是如果源中元素太多,則可能是一個問題。)

您正在使用兩個迭代器(和隱藏的分配器參數)調用std::vector的模板化構造函數。 這是相關標准語錄的意思:

23.3.6.2矢量構造函數,復制和分配[vector.cons]

template <class InputIterator> 
vector(InputIterator first, InputIterator last, const Allocator& = Allocator());

9效果:使用指定的分配器構造一個等於[first,last)范圍的向量。

10復雜度:僅對T的副本構造函數進行N次調用(其中N是第一個和最后一個之間的距離), 並且如果第一個和最后一個迭代器屬於前向,雙向或隨機訪問類別,則不進行任何重新分配 如果它們只是輸入迭代器,它將對T的副本構造函數進行N階調用,並對其進行log(N)重分配。

因為您是從std::list (雙向迭代器)初始化的,所以只會分配一個。

使用輸入迭代器完成從標准輸入OTOH的讀取,然后可能會有多個重新分配。 但是請注意,元素在內存中移動的平均次數仍為O(1) (由於采用指數內存分配策略)。

根據§23.3.6.2/ 10中的標准,只要迭代器是前向迭代器,雙向迭代器或隨機訪問迭代器,就沒有重新分配。 如果迭代器是輸入迭代器,則存在O(log N)重新分配。

注意: std::list具有雙向迭代器。

您問這是如何實施的? 大概,它通過了一次以計算兩個迭代器之間的距離(或調用std::distance或內部版本),然后又進行了另一遍以實際初始化向量。

暫無
暫無

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

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