在矢量上調用clear()
將調用存儲在矢量中的任何析構函數,這是一個線性時間操作。但是,當矢量包含基本類型如int
或double
時,情況如何?是`std :: vector <primitive> :: clear()`常量時間操作嗎?
回答
從可能實施vector
的POV中考慮這一點。當您調用時:
delete [] internalPtr;
會發生什麼情況?
- 堆必須回收的空間相鄰塊
- 析構函數必須解僱或internalPtr
前者,則仍必須爲基本類型的每個對象,但是析構函數不爲他們存在。所以delete[]
將執行堆上如何快速刪除的記憶
至少使用默認分配器,'std :: vector'不會使用'delete [] internalPtr;'。 – 2013-02-20 00:50:10
我不能在C++ 11標準中找到任何支持它的東西。鏈接可能是錯誤的。 – juanchopanza 2013-02-20 00:59:04
我相信答案是依賴於實現的。線性時間最多需要,但有些實現可能會選擇優化此操作。
根據'Does clearing a vector affect its capacity?',即使調用.clear
,MSVC和G ++都不會降低其向量的容量。看看G ++頭文件,只要元素是標量(基本算術類型或指針),顯然.clear
與默認分配器是恆定時間的。
這似乎與標準中找不到有關'vector :: clear()'(或順序容器'clear()')的事實一致。當然,這可能歸咎於我沒有正確搜索...... – juanchopanza 2013-02-20 01:09:37
@juanchopanza:我看了規範,它確實似乎[缺少](http://stackoverflow.com/questions/14970747/is-the-complexity-of-vectorclear-未指定)。但請注意,指定'erase(begin(),end())'需要的時間等於調用每個析構函數所需的時間量。 – nneonneo 2013-02-20 01:27:36
嗯..它說清楚了()是線性的,但我們也知道,它要求每一個項目的析構函數...
http://www.cplusplus.com/reference/vector/vector/clear/
如果析構函數調用IST不是線性的是什麼?
然而,在原語的析構函數調用是線性
所以是的,在原語是明確的()總是線性操作
OP特別詢問了具有微不足道的析構函數的基元。 – nneonneo 2013-02-20 01:00:06
它說它是線性的?我在C++ 11標準的任何地方都找不到它,但我可能會錯過一些東西。 – juanchopanza 2013-02-20 01:00:06
@juanchopanza和nneonneo固定 – cIph3r 2013-02-20 01:04:31
- 1. std :: vector <std :: vector <T>> vs std :: vector <T*>
- 2. iterate std :: vector <std :: vector <char>>?
- 3. 是std :: vector :: clear() - 一個二維矢量線程的內部向量安全嗎?
- 4. std :: vector <T> :: clear()是什麼時候T是一個原始類型?
- 5. vector :: clear()花費那麼多時間?
- 6. std :: vector :: clear()在代碼重構後需要更多時間
- 7. C++ std :: vector <std :: shared_ptr>
- 8. 展開std :: vector <std :: vector <T>>轉換爲std :: vector <T>
- 9. 常量引用std :: vector
- 10. 常量莢和std :: vector的
- 11. std :: vector <T>
- 12. vector :: clear in C++
- 13. 如何從std :: vector <>
- 14. 將std :: vector <std :: vector <float>>轉換爲float **
- 15. 是std :: vector異常中立?
- 16. 將std :: vector <std :: unique_ptr <T>>移動到std :: vector <std :: shared_ptr <T>>
- 17. std :: sort on std :: vector <std::string>
- 18. std :: vector <float> to std :: vector <glm::vecX>沒有複製
- 19. std :: vector <> :: emplace_back()安全嗎?
- 20. std :: size_t或std :: vector <Foo> :: size_type?
- 21. 繼承std :: vector
- 22. 解引用不能用於std :: vector <std :: vector <double>>
- 23. C++循環std :: vector <std :: map <std :: string,std :: string>>
- 24. 如何迭代boost :: variant <std :: vector <int>,std :: vector <String>>?
- 25. 錯誤:'operator *'不匹配(操作數類型爲'std :: vector <std :: complex <double>>'和'std :: complex <double>')
- 26. std ::在std :: string和std :: vector之間移動<unsigned char>
- 27. std :: vector:值得嗎?
- 28. 在聲明「std :: vector <X> f();」中,是「std :: vector <X>」的一個實例嗎?
- 29. 在std :: vector上使用std :: unique()<std :: unordered_set <T>>
- 30. std :: unique_locks的std :: vector向量
(或不變,除非它是不是比線性多,這並不重要)可能的重複[什麼是std :: vector :: clear()是什麼時候T是一個基本類型?](http://stackoverflow.com/questions/11235975/what-is-the-complexity-of- stdvectortclear-when-t-a-a-primitive-type) –
nneonneo
2013-02-20 02:14:12
[std :: vector :: clear,constant time?]的可能重複(http://stackoverflow.com/questions/14094302/stdvectorintclear-constant-time ) –
jogojapan
2013-02-20 02:15:18