17

Eric Niebler の範囲提案を読ん
でいるときに、終了イテレータの代わりにセンチネルという用語に出くわしました。
終了イテレータに対するセンチネルの利点を理解するのに苦労しています。
標準的なイテレータのペアではできない、sentintel がテーブルにもたらすことの明確な例を誰かが提供できますか?

センチネルは、過去のイテレータの抽象化です。センチネルは、範囲の終わりを示すために使用できる通常の型です。センチネルと範囲を示すイテレータは、EqualityComparable である必要があります。センチネルは、イテレータ i はセンチネルと等しく、i はその要素を指します。」-- N4382

センチネルは、位置だけでなく、範囲の終わりを決定する関数として機能すると思いますか?

4

3 に答える 3

16

Sentinel は、終了イテレータが異なる型を持つことを単純に許可します。

末尾反復子で許可される操作は制限されていますが、これはその型には反映されていません。*イテレータには問題ありません.end()が、コンパイラが許可します。

センチネルには単項逆参照 (または など) がありません++。これは通常、最後の反復子の 1 つ後ろの最も弱い反復子と同じように制限されますが、コンパイル時に適用されます。

見返りがあります。多くの場合、最終状態を検出することは、それを見つけるよりも簡単です。センチネルを使用==すると、実行時ではなくコンパイル時に「他の引数が最後を過ぎているかどうかを検出する」ためにディスパッチできます。

その結果、C の同等のコードよりも低速だった一部のコードが、C レベルの速度までコンパイルできるようになりましたstd::copy。センチネルがなければ、コピーの前に最後を見つけるためにスキャンするか、「私はエンド センチネルです」(または同等の) という bool フラグを指定してイテレータを渡し、 でチェックする必要がありました==

カウントベースの範囲で作業する場合、他にも同様の利点があります。さらに、zip 範囲1のようなものは表現が容易になります (最後の zip センチネルは両方のソース センチネルを保持し、どちらかのセンチネルが保持する場合は等しい値を返します: zip イテレータは最初のイテレータのみを比較するか、両方を比較します)。

別の考え方としては、アルゴリズムは終了イテレータの後に渡されたパラメータに対してイテレータの概念を十分に活用しない傾向があり、そのイテレータは実際には異なる方法で処理されるということです。Sentinel は、呼び出し元がその事実を利用できることを意味し、これにより、コンパイラはそれをより簡単に利用できるようになります。


1ジップ レンジとは、2 つ以上のレンジから始めて、それらをジッパーのように「圧縮」したときに得られるものです。範囲は、個々の範囲要素のタプルを超えています。zip イテレータを進めると、「含まれる」イテレータがそれぞれ進められ、逆参照と比較についても同様です。

于 2015-10-02T08:07:16.083 に答える