2017-05-18 12 views
2

次のコードは、これは一例でありvector :: eraseは逆イテレータでは機能しませんか?

some_vector.erase(some_vector.rbegin(), some_vector.rbegin()+1); 

コンパイルされません、私は最後のn個の要素を削除するためのより良いオプションがあります知っています。 GCCには、消去のための一致する機能がないと伝えられています。私は間違ったことをしたのでしょうか、逆のイテレータではうまくいきませんでしたか?ただし、前方イテレータでうまく動作しますが、

答えて

6

です。しかし、逆方向反復子は、順方向反復子を取得するためにbase()メソッドを提供します。返された順方向イテレータが、逆方向イテレータが指し示す要素に続く要素を指していることに注意してください。

あるいは、別の言い方をする、.rbegin().base() == .end().rend().base() == .begin()

ので、固定のコードは次のようになります。我々は、彼らがしているので、周りのイテレータの順序を交換する必要があり

some_vector.erase(
    (++(some_vector.rbegin())).base(), 
    some_vector.rbegin().base() 
); 

注意リバースイテレータ。 2番目の引数は、の後に続くのイテレータでなければなりませんが、逆イテレータの順序を入れ替えないと、これは当てはまりません。だから我々は、2つの逆イテレータab、およびb >= aを持っているならば、我々はerase()ために、このイディオムを使用することができます。

container.erase(b.base(), a.base()); 

より一般的には、それが逆イテレータ[a、b)はその範囲[Bの範囲で保持しています.base()、a.base())は、同じ順序の要素を逆の順序で繰り返します。

+0

ありがとう、私は1週間以来私のコードをデバッグしようとしていませんでした。私はbase()メソッドが実際にはby-by-1イテレータを返していたとは決して考えていませんでした... –

+0

@AaaBbb [このページ] http://en.cppreference.com/w/cpp/iterator/reverse_iterator)は、リバースイテレータに関する推論のための非常に貴重なリファレンスです。 – cdhowie

関連する問題