回答
如果push_back()
增加矢量超過其當前capacity()
,它將重新分配其數組,這是不高效的。因此,如果你確切地告訴載體有多少元素要存儲,那麼你不需要重新分配載體的代價,特別是如果載體必須改變存儲器中的位置(因爲它確實不適合它的地方),因此它自己複製(額外費用!)。
但是你要相信我嗎?也許。您應該但相信事實:
測試代碼
#include <vector>
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
using namespace std;
int main() {
const int N = 1000000;
using namespace std::chrono;
{
// push_back only
high_resolution_clock::time_point t1 = high_resolution_clock::now();
vector<int> v1;
for(int i = 0; i < N; ++i)
v1.push_back(i);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "It took me " << time_span.count() << " seconds.";
std::cout << std::endl;
}
{
// set size and use operator []
high_resolution_clock::time_point t1 = high_resolution_clock::now();
vector<int> v2(N);
for(int i = 0; i < N; ++i)
v2[i] = i;
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "It took me " << time_span.count() << " seconds.";
std::cout << std::endl;
}
return 0;
}
輸出
It took me 0.0170491 seconds.
It took me 0.00236058 seconds.
正如你所看到的,實驗結果表明,通過設置向量的大小,我們都快一個數量級。
我的源代碼爲time measurements。
你能澄清你的意思嗎?太大了。如果我連續push_back(s),矢量認爲哪個點太大? – 2015-04-01 00:33:26
當新的size()會超過當前的capacity()時,它會重新分配內部數組。你可以使用'reserve()'設置'capacity()'和'resize()'來設置'size()'。 – 2015-04-01 00:33:55
看我的編輯。由於太大,我的意思是比當時的矢量可以存儲的大。究竟是什麼@RemyLebeau說! – gsamaras 2015-04-01 00:34:05
vector<myClass> v(10)
預先分配一次內部數組,然後用10個默認構造的myClass
對象自動填充內部數組。
vector<myClass> v
不預先分配數組,但您可以使用reserve()
和resize()
。
push_back()
將在每次新的size()
將超過當前的capacity()
時重新分配並複製內部陣列。
- 1. 爲什麼矢量具有不同的容量和大小?
- 2. 什麼是矢量長度和矢量緩存大小?
- 3. C++矢量大小。爲什麼-1大於零
- 4. C++矢量大小爲零
- 5. 爲什麼矢量的大小超出範圍
- 6. 爲什麼圖像大於設置的大小沒有縮小
- 7. wpf app - 爲什麼窗口大小比我設置的大?
- 8. 查找矢量的大小
- 9. 靜態矢量的大小
- 10. 爲什麼一個deque的大小會少於一個小數?
- 11. 連詞到Clojure的矢量,如果矢量大小小於一定量
- 12. 爲什麼矢量的容量在傳遞給一個函數後會變得與它的大小相等?
- 13. 這個C矢量爲什麼不循環自動矢量化?
- 14. 什麼設置堆棧大小?
- 15. 設置矢量的矢量的第二尺寸爲零(C++)
- 16. 點的ggplot阿爾法設置爲一個數字矢量
- 17. 將小部件大小設置爲其他大小的一半
- 18. 矢量大小添加
- 19. 爲什麼iPhone視圖大小設置爲480
- 20. 設置大量集合的大小
- 21. 爲什麼在按鈕大小看起來不同的矢量圖像
- 22. 大小vs矢量的容量?
- 23. 爲什麼不設置UIView的邊界限制其大小
- 24. 爲什麼我的矢量是空的?
- 25. 爲什麼默認的HDFS塊大小設置爲134.2 MB(大約)
- 26. 爲什麼盒裝矢量這麼慢?
- 27. 設置的二維矢量
- 28. 矢量矢量有什麼問題?
- 29. 插入小矢量成一個較大的
- 30. 什麼是矢量?
每次推回後,打印'capacity()'。每當它發生變化時,都會發生動態分配。現在嘗試先調用'reserve'。 – 2015-04-01 00:32:52