Sentinel は、終了イテレータが異なる型を持つことを単純に許可します。
末尾反復子で許可される操作は制限されていますが、これはその型には反映されていません。*
イテレータには問題ありません.end()
が、コンパイラが許可します。
センチネルには単項逆参照 (または など) がありません++
。これは通常、最後の反復子の 1 つ後ろの最も弱い反復子と同じように制限されますが、コンパイル時に適用されます。
見返りがあります。多くの場合、最終状態を検出することは、それを見つけるよりも簡単です。センチネルを使用==
すると、実行時ではなくコンパイル時に「他の引数が最後を過ぎているかどうかを検出する」ためにディスパッチできます。
その結果、C の同等のコードよりも低速だった一部のコードが、C レベルの速度までコンパイルできるようになりましたstd::copy
。センチネルがなければ、コピーの前に最後を見つけるためにスキャンするか、「私はエンド センチネルです」(または同等の) という bool フラグを指定してイテレータを渡し、 でチェックする必要がありました==
。
カウントベースの範囲で作業する場合、他にも同様の利点があります。さらに、zip 範囲1のようなものは表現が容易になります (最後の zip センチネルは両方のソース センチネルを保持し、どちらかのセンチネルが保持する場合は等しい値を返します: zip イテレータは最初のイテレータのみを比較するか、両方を比較します)。
別の考え方としては、アルゴリズムは終了イテレータの後に渡されたパラメータに対してイテレータの概念を十分に活用しない傾向があり、そのイテレータは実際には異なる方法で処理されるということです。Sentinel は、呼び出し元がその事実を利用できることを意味し、これにより、コンパイラはそれをより簡単に利用できるようになります。
1ジップ レンジとは、2 つ以上のレンジから始めて、それらをジッパーのように「圧縮」したときに得られるものです。範囲は、個々の範囲要素のタプルを超えています。zip イテレータを進めると、「含まれる」イテレータがそれぞれ進められ、逆参照と比較についても同様です。