2009-03-14 6 views

答えて

21

はシーケンスではまだだ最後の要素の後にイテレータポインティングを返します。 eraseは、最初から最後の引数(両方のイテレータ)までのすべてを消去します。

+1

remove_if()+1を忘れました。 –

+0

非常にクールです。前にそれを見たことはありません。 +1 – Bernard

+0

ありがとう、それはトリックでした。 –

6

remove_ifを使用することは、これを行う「正しい」方法です。アイテムを削除するとイテレータが無効になるため、イテレータを使用しないで循環して消去するように注意してください。実際、イレーズはO(n)なので、あなたのアルゴリズムはO(n^2)になりますので、その主な方法としてerase()を使う例は、ベクトルには悪い考えです。これはO(n)アルゴリズムでなければなりません。

私が以下に示す方法はremove_ifよりも高速ですが、remove_ifと違って、要素の相対的な順序は保持されません。注文の管理(ベクトルのソート)を気にする場合は、上記の答えのようにremove_ifを使用してください。注文に関心がなく、削除するアイテムの数が通常ベクトルの4分の1未満の場合、この方法の方が速いでしょう:

for(size_t i = 0; i < vec.size();) 
    if(vec[i].isTiredOfLife()) 
    { 
     vec[i] = vec.back(); 
     vec.pop_back(); 
    } 
    else 
     ++i; 
+0

D'oh。私はそれを忘れてしまった。リンク先のページでも太字で表示されます。 :o私は私の投稿を削除したので、誰もそれを使用しません。 – Bernard

+0

これはベクトルの要素を再配置しませんか?例えば、入力ベクトルがソートされ、出力ベクトルがソートされないと仮定すると、最後の要素は最初に削除された要素の位置を取る。 –

+0

バーナードを参照しないように答えを更新したいかもしれません。 –

関連する問題