がハーフオープン範囲のSTLの概念をサポートするために、我々は、アレイの1-過去エンドを指すように許可されています。 3つの要素からなるベクトルがあるとします。 std::vector::iterator
場合、これらの場所にbegin
end
と点通常のリリースの場合のように構築し、ポインタとして実装されている:ドットが一過去エンド擬似要素を表すどこにポイントがありますか?
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
begin end
。 1つ前のようなものはないので、正確にはrend
を指していますか?私が説明しましょう:rend
は違法ポインタであるため、
+---+---+---+....
| | | | .
+---+---+---+....
^ ^
rend rbegin
は明らかに、図は、間違っています。だから私はstd::vector::reverse_iterator
の実装は、リリースビルドでさえ、ポインタになることはないと思います。
私は正しいですか? reverse_iterator
を実装する最も効率的な方法は何でしょうか?
Cでは、ポインタがオブジェクトまたはオブジェクトの最後の要素を指していない場合、そのポインタが評価される(参照解除されない)場合、その動作は未定義です。この質問はC++に関するものですが、そこには違いはないと私は考えています。私はあなたが何を意味するのかを明確にすべきだと思います:コンテナの外側を指します。 – this
@this:あなたが言うことは*ポインタ*については真実であるが、イテレータ*については必ずしもそうであるとは限りません。反復子は必ずしもポインタではありません。 –
問題は、私の理解では、たとえあなたが逆参照しても問題ではないということです。私たちは、ポインターの算術演算を実行することも、「最初から始まる」ポインターを計算することも許されません。だから、配列の先頭を指すポインタを作成するだけでは、それを作成したり、サイズを測定するなどの行為がUBであるため、逆参照しない限りOKです。または私は間違っていますか? –