std::reverse_iterator::base
リンク先をちゃんと読んでなくてバグを出してしまった。
How do I erase a reverse_iterator from an stl data structure?
http://stackoverflow.com/questions/404258/how-do-i-erase-a-reverse-iterator-from-an-stl-data-structure
#include <iostream> #include <vector> int main() { std::vector< int > v; for ( int i = 0; i < 10; ++i ) { v.push_back( i ); } for ( auto i = v.rbegin(); i != v.rend(); ++i ) { std::cout << "reverse_iterator : " << *i; if ( i.base() == v.end() ) { // v.rbegin() == v.end() std::cout << ", iterator : " << "[end]"; } else { std::cout << ", iterator : " << *(i.base()); } std::cout << std::endl; } (void)fgetc( stdin ); return EXIT_SUCCESS; }
出力結果
reverse_iterator : 9, iterator : [end] reverse_iterator : 8, iterator : 9 reverse_iterator : 7, iterator : 8 reverse_iterator : 6, iterator : 7 reverse_iterator : 5, iterator : 6 reverse_iterator : 4, iterator : 5 reverse_iterator : 3, iterator : 4 reverse_iterator : 2, iterator : 3 reverse_iterator : 1, iterator : 2 reverse_iterator : 0, iterator : 1
冷静に考えれば、v.rbegin() == v.end() って事なんですけども。
reverse_iteratorの差している要素をeraseしたい場合、一つ前の位置のものを削除しないといけないって事ですね。