逆イテレータを使用して std::list をトラバースし、挿入時に取得された順方向イテレータを使用してリストからいくつかの要素を消去しています。以下にサンプルプログラムを示します。リストから要素を削除しても、削除された要素を参照するものを除いて、他のイテレータは無効にならないことを読みました。しかし、reverse_iterators について言及されておらず、プログラムがクラッシュしています。使用法が間違っているかどうか誰か教えてください。
プログラムが行っていることは、要素をリストに追加し、その反復子を格納し、リストを逆に反復し、格納された反復子を使用してリスト内の唯一の要素を削除することです。
出力は、コード サンプルの下に貼り付けられます。
#include <list>
#include <iostream>
using namespace std;
struct node
{
int data;
list<node*>::iterator iter;
} a;
int main()
{
list<node*> l;
a.data = 1;
l.push_front( &a );
a.iter = l.begin();
list<node*>::reverse_iterator ri = l.rbegin();
while ( ri != l.rend() )
{
cout << (*ri)->data << endl;
list<node*>::reverse_iterator rj = ri;
++ri;
if ( ri == l.rend() )
cout << "before erase: reached end" << endl;
l.erase((*rj)->iter);
if ( ri == l.rend() )
cout << "after erase : reached end" << endl;
else
cout << "after erase : Not reached end" << endl;
}
}
出力
1
before erase: reached end
after erase : Not reached end
610568524
before erase : reached end
Segmentation fault