清除std::list
和std::set
的最佳,最快和最可靠的方法是什麼?在C++中清除容器的最佳方式是什麼?
// 1st
list.clear();
set.clear();
// 2nd
list = {};
set = {};
// 3rd
list.swap(std::list<some_type>{});
set.swap(std::set<some_type>{});
清除std::list
和std::set
的最佳,最快和最可靠的方法是什麼?在C++中清除容器的最佳方式是什麼?
// 1st
list.clear();
set.clear();
// 2nd
list = {};
set = {};
// 3rd
list.swap(std::list<some_type>{});
set.swap(std::set<some_type>{});
所有這些選項將是大致相同的性能(與clear
版本需要一點比其他兩種操作較少,但性能損失很可能是不可量化),但版本(1)container.clear
是最清楚的(就代碼可讀性而言),所以我會一起去。
值得注意的是,list.swap(std::list<some_type>{});
是一個編譯錯誤,因爲std::list::swap
沒有右值引用的重載,並且只接受非常量左值引用。同上std::set::swap
。你必須創建一個指定的臨時對象並與之交換。
你爲什麼說他們會有相同的表現? –
@NeilButterworth,因爲他們會做同樣的事情。他們將調用容器中所有對象的析構函數並釋放分配的內存。 – SergeyA
但不是這樣,'list.swap(std :: list
這三者同樣「可靠」。
與.clear()
的版本顯然是最清晰的。 :)
儘管如此,使用爲該任務命名的功能以及專門爲該任務添加的功能。這裏不需要神祕的「技巧」。編寫自我記錄代碼。
因爲黑羊'std :: vector',我很好奇:) –
您的示例是否有兩個基於節點的容器是巧合嗎?因爲對於'std :: vector',所顯示的操作的語義不同。如果您已經意識到這一點,也許會提到這個問題。 – 5gon12eder
我已經知道了'std :: vector swap trick',因爲我有一個內部使用這兩種數據結構的類,所以我很好奇。 –
只需從現代編譯器的優化構建中查看生成的asm,即可獲得答案 - 5分鐘的工作臺面。 –