2017-01-23 52 views
0

清除std::liststd::set的最佳,最快和最可靠的方法是什麼?在C++中清除容器的最佳方式是什麼?

// 1st 
list.clear(); 
set.clear(); 

// 2nd 
list = {}; 
set = {}; 

// 3rd 
list.swap(std::list<some_type>{}); 
set.swap(std::set<some_type>{}); 
+0

您的示例是否有兩個基於節點的容器是巧合嗎?因爲對於'std :: vector',所顯示的操作的語義不同。如果您已經意識到這一點,也許會提到這個問題。 – 5gon12eder

+0

我已經知道了'std :: vector swap trick',因爲我有一個內部使用這兩種數據結構的類,所以我很好奇。 –

+0

只需從現代編譯器的優化構建中查看生成的asm,即可獲得答案 - 5分鐘的工作臺面。 –

回答

5

所有這些選項將是大致相同的性能(與clear版本需要一點比其他兩種操作較少,但性能損失很可能是不可量化),但版本(1)container.clear是最清楚的(就代碼可讀性而言),所以我會一起去。

值得注意的是,list.swap(std::list<some_type>{});是一個編譯錯誤,因爲std::list::swap沒有右值引用的重載,並且只接受非常量左值引用。同上std::set::swap。你必須創建一個指定的臨時對象並與之交換。

+1

你爲什麼說他們會有相同的表現? –

+1

@NeilButterworth,因爲他們會做同樣的事情。他們將調用容器中所有對象的析構函數並釋放分配的內存。 – SergeyA

+1

但不是這樣,'list.swap(std :: list {});'構造一個新的無名對象? –

2

這三者同樣「可靠」。

.clear()的版本顯然是最清晰的。 :)

儘管如此,使用爲該任務命名的功能以及專門爲該任務添加的功能。這裏不需要神祕的「技巧」。編寫自我記錄代碼。

+0

因爲黑羊'std :: vector',我很好奇:) –

相關問題