コード:
for(x=abc.begin();x!=abc.end();x++)
{
if(-----)
{
----
abc.erase(x);
}
}
そして、エラーは :::
危険なイテレータの使用法
消去後のイテレータは無効であるため、逆参照したり、別のイテレータと比較したりすることは無効です。
上記のコードで消去関数を使用する際の間違った使用法は何ですか?
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 によるコメントに感謝します。
ループ内の制御変数としてxを使用しています。これはerase()によって無効化されるため、ループの先頭で後でインクリメントすることが安全(または意味のある)であるかどうかを確認することはできません。
x
へのポインタabc
です。が指すアイテムを消去したらx
、何をx
指しているのか、どのようx++
に機能するのですか?
反復しているコンテナについては何も言いませんでした。コンテナのタイプによって、無効化されるイテレータが異なります。確かに、削除された要素へのイテレータは無効ですが、たとえば、削除された要素を過ぎた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;
}