clear()
成員函數視為常量時間復雜度O(1)的。但是其實不然。我感覺可能是很多人都知道對于vector
而言,clear()
之后,修改了size()
的結果,不影響capacity()
的結果,因而得出clear()
只是修改了某個標記,是常量時間復雜度的錯誤結論。其實C 標準明確指出不管是序列容器(比如vector
)還是關聯容器(比如unordered_map
)其clear()
成員函數都是線性時間復雜度O(n)的。因為只要執(zhí)行了clear()
就需要對其存儲的元素調用析構函數,這個析構操作顯然是逐個析構的。因而時間復雜度是O(n)。當然在實踐中,也有個例。比如當vector
存儲基本數據類型或POD類型(比如基本數據類型構成的struct)的時候,由于其元素類型沒有析構函數(也不需要析構函數),加之vector
內部連續(xù)存儲的特性,編譯器的實現是可以在常量時間完成clear()
的。Linear in size(destructions). This may be optimized to constant complexity for trivially-destructible types(such as scalar or PODs), where elements need not be destroyed http://www.cplusplus.com/reference/vector/vector/clear當然僅限于
vector
存儲基本數據類型和POD類型的時候,編譯器可能有此優(yōu)化。如果vector
存儲的是其他類型的對象,或者是其他容器(比如list
、map
、unordered_map
)都是沒辦法做這個優(yōu)化的!所以在工程實踐中,我們要思考是否每次都需要及時的clear掉一個容器。比如在后臺服務中,有些容器類型的變量在命中某些條件下要進行clear()
,后續(xù)邏輯中判斷容器是空的,就不在用之進行某些邏輯(比如遍歷它,進行某種操作)。其實也可以用一個bool標記來存儲后續(xù)是否需要遍歷該容器,待到本次請求的響應返回給client之后,再來清理這個容器也不遲。當然這種操作在容器的元素個數不多的時候是完全沒有必要的,會喪失一些可讀性。不過這種思考還是需要有的。如果元素過多的時候,或許可能是性能優(yōu)化的一個小點。auto
標普500指數今年迄今為止下跌22.7%,但高盛(Goldman Sachs)策略師認為估值依然太高。摩根士丹利旗下的Morgan Stanley Wealth Management稱,面對高通脹環(huán)境下的利率大幅上升,股...
關鍵字: DMA MANAGEMENT 高通 ST