10

私はC++を初めて使用します。経験豊富なコーダーがこれをどのように行うのか知りたいです。

私が持っているもの:

set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);

for(set<int>::iterator itr = s.begin(); itr != s.end(); ++itr){
if (!(*itr % 2))
    s.erase(itr);
}

そしてもちろん、それは機能しません。itrは、消去された後にインクリメントされるためです。セットから要素を消去した後、毎回Itrがセットの先頭を指す必要があるということですか?

4

4 に答える 4

16
 for(set<int>::iterator itr = s.begin(); itr != s.end(); ){
  if (!(*itr % 2))
      s.erase(itr++);

  else ++itr;
 }

スコットマイヤーズによる効果的なSTL

于 2010-01-18T19:09:15.677 に答える
11

std :: setから要素を消去すると、その要素を指すイテレータのみが無効になります。

ターゲット要素を消去する前に、次の要素へのイテレータを取得します。

于 2010-01-18T19:05:29.370 に答える
8

最初に戻る必要はありません。set::erase消去されるアイテムを参照するイテレータのみを無効にするため、消去する前にイテレータをコピーしてインクリメントする必要があります。

for(set<int>::iterator itr = s.begin(); itr != s.end();)
{
    set<int>::iterator here = itr++;
    if (!(*here % 2))
        s.erase(here);
}
于 2010-01-18T19:08:51.620 に答える
-1

最良の方法は、remove_ifとeraseの組み合わせを使用することです

s.erase(remove_if(s.begin(), s.end(), evenOddFunctor), s.end())

これは役に立ちます http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Erase-Remove

スコットマイヤーズによる効果的なSTLも参照してください

Edit:私の解決策は間違っていますが、私はそれを削除していません。可変/不変のイテレータについて知らない私のような人にとっては良い学習になるかもしれません

于 2010-01-19T04:20:01.043 に答える