C++STL逆反復器rbegin()とend()はいったい容器のどこを指しているのか.

1767 ワード

C++STLでは、reverse_iteratorがインクリメント操作を実行すると、データへのポインタが減少します.なぜ通常の反復器を直接減らさないのですか?主な原因は,既存の関数の使用を簡略化するためである.diceコンテナの内容を逆方向に表示するには、copy()とostream_を使用します.iteratorは、コンテンツを出力ストリームにコピーします.
ostream_iterator<int, char> out_iter(cout, " ");
copy(dice.rbegin(), dice.rend(), out_iter); // display in reverse order

rebegin()とend()は同じ値(スーパーテール)を返しますが、タイプは異なります(reverse_iteratorとiterator).同様に、rend()とbegin()も同じ値(最初の要素を指す反復器)を返しますが、タイプは異なります.
rpはdiceとして初期化すると仮定する.rbegin()の反転ポインタ.では*rpとは何でしょうか?
  • rebegin()はスーパーテールを返すため、このアドレスをデリファレンスすることはできません.
  • と同様に、rend()が最初の要素の位置である場合、copy()は、区間の最後に区間に含まれないため、1つの位置を早めて停止する.

  • 逆ポインタは先に減算することで,参照を解除することでこの2つの問題を解決した.すなわち、*rpは、*rpの現在の値よりも前に反復器に対して参照解除を実行する.すなわち、rpが位置6を指す場合、*rpは位置5の値であり、このように推定される.