for(x=abc.begin();x!=abc.end();x++)
{
if(-----)
{
----
abc.erase(x);
}
}
とエラーが:::
危険なイテレータの使用
で消去した後、イテレータはそれを間接参照したり、別のイテレータと比較すると、無効で無効です。
上記のコードで消去機能を使用すると間違った使い方は何ですか?
for(x=abc.begin();x!=abc.end();x++)
{
if(-----)
{
----
abc.erase(x);
}
}
とエラーが:::
危険なイテレータの使用
で消去した後、イテレータはそれを間接参照したり、別のイテレータと比較すると、無効で無効です。
上記のコードで消去機能を使用すると間違った使い方は何ですか?
iterator xは、対応する値をabcから削除した後は無効です。これは、それを修正する必要がありますSTLコンテナの
x = abc.begin();
while(x != abc.end())
{
if (-----)
{
----
x = abc.erase(x);
// skipped only to next item
}
else
{ // skip only to next item
++x;
}
}
erase
テンプレート関数は、次の要素を返す、またはend()
。
編集: templatetypedefによるコメントありがとうございました。
x
は、abc
へのポインタです。 x
が指摘している項目を消去したら、x
は何を指しているはずですか?はどのように動作するのですか?
ループの制御変数としてxを使用しています。それはerase()によって無効になるので、ループの先頭でそれをインクリメントすることが安全である(または意味がある)ことは確かではありません。
反復処理中のコンテナについては何も言わなかった。コンテナの型は、どのイテレータが無効になっているかによって異なります。反復子を消去する要素は無効ですが、たとえば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;
}
これは正しく無効化を回避できますが、注意してください...あなたは右の消去を受けるものの後の要素過去 'X'イテレータを飛ばしてしまいます。 – templatetypedef
アップ!あなたが正しい。固定の答え... – harper