2016-04-24 15 views
0

非常に簡単です:次のコードがあり、メソッドeraseは機能しません。 iterator erase (iterator position);C++ペアのリストから消去する

list<pair<string,int>> l0 { { "name1", 20 }, { "name2", 30 }, { "name3", 40 } }; 
for(auto &it : l0) 
    l0 . erase(it); 

pair<string,int>はなく、基本的なデータ型のlistlistがあるという問題があるかもしれません:私はhttp://www.cplusplus.com/reference/list/list/erase/に行けば、構文があるので、私はそこに何の問題が表示されませんか?

編集:問題は、コードがコンパイルできないことです。

+0

ヒント: ' erase()によって変更されます。 –

+0

イテレータの位置を消去するだけでなく、イテレータ(またはすべてのイテレータ)が無効になるだけでなく、コードはコンパイルされません。 –

+0

@DieterLückingまさに、それはコンパイルするつもりはありません。ところで、最初のコメントは私を助けませんでした。別のヒントを教えてもらえますか? – scarface

答えて

1

range-forは、コンテナ内の要素の反復子ではなく、 要素にアクセスすることによってコンテナを反復処理します。

したがって、for(auto &it : l0)では、itはペアのイテレータではなく、 のペアへの参照です。彼が最初に Keeping a valid vector::iterator after erase()の重複としてこれを閉じたときπάνταῥεῖが指摘したように、あなたのコードは それが原因の無効化の仕事ではないでしょうコンパイルしまう場合でも、あなたのコードは、これは言われている

コンパイルできない理由はここにあります消去後のイテレータ:

関数によって削除された要素を参照するイテレータ、ポインタ、および参照は無効です。 他のすべてのイテレータ、ポインタ、および参照は、それらの有効性を維持します。

回避策

あなたは、範囲のために使用していますが、伝統的なfor、およびerase()の戻り値を使用して反復してはならない:

for (auto it=l0.begin(); it!=l0.end();) 
    it = l0.erase(it); // to avoid incrementing an invalidated iterator 

Live demo

+0

この回答は間違っています。すべての2番目の要素だけが消去されます(また、末尾を熟読することもできます)。 –

+0

@DieterLückingあなたは精巧にできますか?ライブデモでは完全に動作するように見えます(erase()の戻り値は "*関数呼び出しによって最後の要素が削除された後の要素を指すイテレータです。シーケンスの要素。* " – Christophe

関連する問題