です。しかし、逆方向反復子は、順方向反復子を取得するためにbase()
メソッドを提供します。返された順方向イテレータが、逆方向イテレータが指し示す要素に続く要素を指していることに注意してください。
あるいは、別の言い方をする、.rbegin().base() == .end()
と.rend().base() == .begin()
ので、固定のコードは次のようになります。我々は、彼らがしているので、周りのイテレータの順序を交換する必要があり
some_vector.erase(
(++(some_vector.rbegin())).base(),
some_vector.rbegin().base()
);
注意リバースイテレータ。 2番目の引数は、の後に続くのイテレータでなければなりませんが、逆イテレータの順序を入れ替えないと、これは当てはまりません。だから我々は、2つの逆イテレータa
とb
、およびb >= a
を持っているならば、我々はerase()
ために、このイディオムを使用することができます。
container.erase(b.base(), a.base());
より一般的には、それが逆イテレータ[a、b)はその範囲[Bの範囲で保持しています.base()、a.base())は、同じ順序の要素を逆の順序で繰り返します。
ありがとう、私は1週間以来私のコードをデバッグしようとしていませんでした。私はbase()メソッドが実際にはby-by-1イテレータを返していたとは決して考えていませんでした... –
@AaaBbb [このページ] http://en.cppreference.com/w/cpp/iterator/reverse_iterator)は、リバースイテレータに関する推論のための非常に貴重なリファレンスです。 – cdhowie