2012-12-17 51 views
-1

我有一個數組,例如ARR,並且ARR中的對象總數是已知的。 我想將ARR中每個對象的屬性複製(放入)STL向量,如VEC。STL向量回推與設定值之間的性能差異

一種方式是通過ARR迭代

VEC.pushback(ARR[i].att); 

另一種方式是

VEC.resize(ARR.size()); 
VEC[i] = ARR[i].att; 

做他們做出關於運行時的性能差異?哪一個更好?謝謝。

後續行動:我想爲有興趣的人提供一些實驗結果。 我試圖通過將50000個整數放入STL向量來調整(1)resize()+'='和(2)reserve()+ push_back()方法。

(1) takes 0.000201s; 
(2) takes 0.000229s. 
  • 兩者都使用g ++編譯-O3,我運行程序幾次。
  • (1)一直優於(2)。
  • (1)有額外的分配,因此在空間方面需要更多的內存。
+5

這最快的方式這是一個糟糕的問題 - 你可以簡單地通過測量來自己回答。問*哪個更好*總是主觀的。 –

+0

@BjörnPollex它爲什麼是主觀的?我希望代碼能夠快速運行,不僅適用於我自己。 –

+0

@ jason.Z然後使用'push_back'或'emplace_back'。它更習慣。只有在投放後才擔心這些事情的表現。 – Pubby

回答

2

調用resize()(或reserve())之前可能會潛在地保存一些調整大小,因爲您添加新項目。無論如何,你已經知道物品的數量,所以它更有意義。

隨着resize()你將有一個默認的構造一步,我會跟reserve()去防止重新分配和push_back()(在C++ 11,emplace_back()如果你的編譯器支持的話)

+0

所以第二個更好? –

+1

爲你自​​己測試 - 但作爲一個猜測,我會這麼說 - 儘管如此,你可以嘗試使用'reserve()',後面跟着'push_back()'或其他函數 - 你可能會獲得稍好的數字。 – Nim

+0

我剛剛做了一些實驗。看到上面的後續:) –

0

我想你應該嘗試QueryPerformanceCounter()函數或在執行前啓動計時器,並在兩種情況下執行後停止。 你可以看到時間的差異,並可以評估每個場景需要多少時間,然後決定哪一個更好的解決方案。

0

如果你想複製數組的數據,你可以簡單地做VEC.assign(ARR,ARR + ARR_size) 如果ARR是一個簡單的陣列,或VEC.assign(ARR.begin(),ARR.end())如果ARR是任何其它序列 這將是用於非POD型

相關問題