C ++仕様(23.2.4.3)によると、vector :: Erase()は、「消去の時点以降のすべてのイテレータと参照」のみを無効にします。
そのため、reverse_iteratorsを使用してすべてのベクターメンバーを渡す場合、現在のイテレーターを消去しても、rend()メンバーが無効になることはありません。
このコードはG++で実行されますが、Windows(VS2010)ではランタイム例外が発生します。
#include <vector>
using namespace std;
int main()
{
vector<int> x;
x.push_back(1);
x.push_back(2);
x.push_back(3);
//Print
for(vector<int>::const_iterator i = x.begin(); i != x.end(); ++i)
printf("%d\n", *i);
//Delete second node
for(vector<int>::reverse_iterator r = x.rbegin(); r != x.rend(); ++r)
if(*r == 2)
x.erase((r+1).base());
//Print
for(vector<int>::const_iterator i = x.begin(); i != x.end(); ++i)
printf("%d\n", *i);
return 0;
}
エラーは興味深いです:
式:デクリメントできないベクトルイテレータ
2回目の実行時に2番目のforループの行に指定されます。デクリメントは、reverse_iteratorの内部の「現在の」イテレータメンバーを指します。これは、reverse_iteratorがインクリメントされるたびにデクリメントされます。
誰かがこの振る舞いを説明できますか?
ありがとう。
編集
このコードサンプルは、rの問題ではなく、rend()の問題であることをよりよく示していると思います。
//Delete second node
for(vector<int>::reverse_iterator r = x.rbegin(); r != x.rend();)
{
vector<int>::reverse_iterator temp = r++;
if(*temp == 2)
x.erase((temp+1).base());
}
vector iterators incompatible
また、消去後のエントリ時にforループでエラーが発生します。