桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

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したい場合、一つ前の位置のものを削除しないといけないって事ですね。