1. ホーム
  2. c++

[解決済み】標準のイテレータの範囲が[begin, end]ではなく、[begin, end]になっているのはなぜですか?]

2022-04-10 19:36:07

質問

なぜ、規格では end() を、実際の末尾ではなく、末尾を1つ過ぎたところにあるとしていますか?

どのように解決するのですか?

簡単に言えば、一番良い議論は、次のようなものである。 ダイクストラ自身 :

  • 範囲の大きさを単純な差にしたい場合 終了  -  開始 ;

  • シーケンスが空のものに縮退している場合,下界を含む方がより自然であり,また,代替案( を除く 下界)では、quot;one-before-the-begin"のセンチネル値の存在が必要となります。

なぜ1ではなく0からカウントを始めるのか、その理由を説明する必要がありますが、それはあなたの質問の一部ではありません。

begin, end)規約の背後にある知恵は、範囲ベースの構造への複数の入れ子または反復呼び出しを扱う何らかのアルゴリズムがある場合、何度も何度も報われ、自然に連鎖します。これに対して、二重に閉じた範囲を使用すると、1つ違いのコードが発生し、非常に不快でノイズの多いコードになります。例えば、パーティション [ n <サブ 0 , n <サブ 1 )[ n <サブ 1 , n <サブ 2 )[ n <サブ 2 , n <サブ 3 ). もう一つの例は、標準的な反復ループである for (it = begin; it != end; ++it) を実行します。 end - begin 回です。もし両端が包括的であれば、対応するコードはずっと読みにくくなります。また、空の範囲をどう扱うか想像してみてください。

最後に、なぜカウントをゼロから始めるべきなのか、その理由もきちんと説明できます。先ほど確立した範囲の半開きの規則では、もしあなたが N の要素(例えば配列のメンバを列挙する場合)は、0が自然なquot;begin"であり、その範囲は[0.A]と書くことができます。 N ) を、厄介なオフセットや補正をせずに使用することができます。

一言で言えば、「数字が見えない」ということです。 1 範囲ベースのアルゴリズムのあらゆる場所で、[begin, end]規則の直接的な結果であり、動機となるものです。