2017-01-23 4 views
0

std::liststd::setを消去するには、最速で最も信頼性の高い方法は何ですか?C++でコンテナをクリアする最も良い方法は何ですか?

(パフォーマンスヒットは、非定量化である可能性があるが、他の二つよりも少し少ない操作を必要 clearバージョンで)すべてのこれらのオプションは、ほぼ同じ性能であろう
// 1st 
list.clear(); 
set.clear(); 

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

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

あなたの例は2つのノードベースのコンテナであるのは偶然でしょうか? 'std :: vector'では、表示される操作の意味が異なるからです。あなたがすでにこれを知っているなら、多分質問に言及してください。 – 5gon12eder

+0

私はすでに 'std :: vector swap trick'を知っていました。私はこれらの2つのデータ構造を内部的に使用するクラスを持っているので、私は興味がありました。 –

+0

現代のコンパイラを使用して最適化されたビルドから生成されたasmを見てみると、5分の作業トップが得られます。 –

答えて

5

が、container.clearのバージョン(1)それらのすべて(コード可読性の観点から)が最も明確であるので、私はそれと一緒に行くだろう。

はコンパイルエラーです。std::list::swapはrvalue参照のオーバーロードを持たず、非const左辺参照のみを受け入れます。同義語はstd::set::swapです。あなたは名前付きの一時オブジェクトを作成し、それとスワップする必要があります。

+1

なぜ彼らは同じパフォーマンスを持つと思いますか? –

+1

@NeilButterworth、同じことをするからです。彼らはコンテナ内のすべてのオブジェクトのデストラクタを呼び出し、割り当てられたメモリを解放します。 – SergeyA

+1

しかしこれはしません、 'list.swap(std :: list {});'名前のない新しいオブジェクトを作成しますか? –

2

3つとも同じように「信頼できる」です。

.clear()のバージョンは明らかに明確です。 :)

ただし、タスクに名前が付けられ、タスク用に特別に追加された関数を使用します。ここでは不可解な「トリック」の必要はありません。自己文書化コードを書く。

+0

私は黒い羊 'std :: vector'のために好奇心を持っています:) –

関連する問題