6

コード:

for(x=abc.begin();x!=abc.end();x++)  
{  
   if(-----)  
   {
      ----  
      abc.erase(x);  
   }
}

そして、エラーは :::
危険なイテレータの使用法
消去後のイテレータは無効であるため、逆参照したり、別のイテレータと比較したりすることは無効です。

上記のコードで消去関数を使用する際の間違った使用法は何ですか?

4

4 に答える 4

7

abc から対応する値を削除すると、反復子 x は無効になります。これで修正されるはずです:

x = abc.begin();

while(x != abc.end())
{
    if (-----)
    {
        ----
        x = abc.erase(x);
        // skipped only to next item
    }
    else
    {   // skip only to next item
        ++x;
    }
}

STL コンテナーのeraseテンプレート関数は、次の要素または を返しend()ます。

編集: templatetypedef によるコメントに感謝します。

于 2011-03-14T07:21:33.610 に答える
5

ループ内の制御変数としてxを使用しています。これはerase()によって無効化されるため、ループの先頭で後でインクリメントすることが安全(または意味のある)であるかどうかを確認することはできません。

于 2011-03-14T06:22:57.663 に答える
4

xへのポインタabcです。が指すアイテムを消去したらx、何をx指しているのか、どのようx++に機能するのですか?

于 2011-03-14T06:22:54.557 に答える
1

反復しているコンテナについては何も言いませんでした。コンテナのタイプによって、無効化されるイテレータが異なります。確かに、削除された要素へのイテレータは無効ですが、たとえば、削除された要素を過ぎたstd::vector すべてのend()イテレータでは無効になります ( を含む)。また、理由は不明ですがset::erase、消去された要素へのイテレータのみを無効にしますが、次の要素へのイテレータは返されません。

だからとstd::set

while (x != abc.end()) // end() will not change and even can be stored
{
    if (...)
        abc.erase(x++); // increments before erasing
    else
        ++x;
}
于 2011-03-14T09:57:59.163 に答える