在C++中,只需使用push_back方法即可將元素添加到矢量中。該方法修改矢量的大小。 那麼使用std :: vector :: reserve的目標是什麼?我應該什麼時候使用它?爲什麼使用std :: vector :: reserve有用?
回答
當您知道至少有n個元素進入矢量時,您可以使用保留。調整容器大小是一項代價高昂的操作 - 您分配新內存,將舊內容複製到內存中,然後刪除舊的內存。如果您默認知道您將獲得至少10000個元素,則最好爲矢量保留大小,而不是讓矢量重新分配內存超過必要的次數。
簡而言之,就是效率。
比效率更重要:它確保迭代器保持有效。 –
調整載體可以顯著降低執行速度(例如追加大量的數據給它時)
基準表示:
This effectively increases the container size by one, which causes an automatic
reallocation of the allocated storage space if -and only if- the new vector size
surpasses the current vector capacity.
所以有助於尺寸的向量上的值,其中你理想情況下,對於您的所有數據來說都足夠了,而且還沒有剩下。矢量縮減的調整大小時間將加速您的應用程序
這是出於效率的原因 - 您可以根據需要爲內存分配儘可能多的元素,如果您知道初始化 - 這種方式向量可以一次分配所有內容,並且如果超過分配的大小將不會增加。
[4] Reserve()會導致手動重新分配。 使用reserve()的主要原因是效率:如果您知道您的最終容量必須增長,那麼通常更有效率的是一次分配該內存,而不是依靠自動的 重新分配方案。使用reserve()的另一個原因是你可以控制迭代器的失效。
它可以用來保證迭代器的有效性,或作爲優化。向矢量添加元素時,如果新大小大於容量,則矢量必須重新分配,將所有現有元素複製(或移動)到新緩衝區中。這使所有迭代器都無效,並且可能很昂貴。儲備功能確保最小的容量。如果您事先知道最大大小並對其進行預留,那麼添加元素將永遠不會使新元素前面的迭代器失效,並且永遠不會需要複製。 (對於大多數代碼,這是迭代器有效性的問題,強制使用保留。)
- 1. std :: vector reserve()和push_back()比resize()和數組索引快,爲什麼?
- 2. vector :: reserve是做什麼用的?
- 3. std ::使用std :: vector :: reserve時,排序順序是從最大到最小的?
- 4. std :: set和std :: vector有什麼區別?
- 5. 使用std :: vector作爲std :: map的關鍵字在未找到並使用reserve()時未返回end()
- 6. 爲什麼不是std :: string是std :: vector的專門化?
- 7. 在調用vector :: assign()之前調用vector :: reserve()會更好嗎?
- 8. 什麼是std :: vector :: front()用於?
- 9. 使用std :: vector的
- 10. 爲什麼std :: vector需要operator =
- 11. 爲什麼不需要使用「新」來初始化std :: vector?
- 12. 爲什麼我不能使用std :: vector元素的別名?
- 13. 爲什麼使用new運算符而不是std :: vector?
- 14. 爲什麼std :: vector和std :: array的C++ initializer_list行爲不同?
- 15. 在MATLAB中預先分配內存àla std :: vector :: reserve(n)
- 16. 正在訪問std :: vector :: reserve safe之後的原始指針嗎?
- 17. boost :: container :: vector比std :: vector更快嗎?爲什麼?
- 18. 爲什麼std :: move使用std :: remove_reference?
- 19. 爲什麼std :: fstream使用char *?
- 20. 爲什麼要用cl :: vector?
- 21. 推入std :: vector時std :: unique_ptr的正確用法是什麼?
- 22. 爲什麼std :: vector fill構造函數不能啓用安裝?
- 23. 爲什麼unique_ptr可以用於std容器,vector <>例如?
- 24. 使用strcpy與std :: vector
- 25. std :: vector bad_alloc不使用push_back
- 26. OpenGL:使用VBO與std :: vector
- 27. 使用std :: lower_bound與std :: vector :: const_iterator
- 28. 使用std :: unary_function清除std :: vector指針
- 29. std :: shared_ptr有什麼問題<std :: vector <double>>
- 30. 爲什麼沒有在gcc-4.9.1-4ubuntu2中手動輸入std :: vector?
它是最小化或徹底消除緩衝區調整大小和引入的命中(複製/移動會變得昂貴,特別是對於大型對象的數量)。在'operator new/delete'宇宙中沒有'realloc'等價物。要「擴展」分配,需要單獨分配,複製或移動,然後釋放舊內存。通過「聲明」你的意圖,你可以避免這種細微差別。一隻卑鄙的兔子很可愛。百萬平均的兔子是一個問題)。 – WhozCraig