2013-03-06 5 views

答えて

27

機能begin()end()半分開いた範囲を定義する([begin, end)を書くことができ、なぜだ、これは意味:
を範囲は、最初の要素を含んでいるが、最後の要素を除外します。したがって、名前は最後を過ぎています。

enter image description here

半分開いた範囲の利点がある:

  1. それは空の範囲のために特別な処理を回避することができます。空の範囲の場合、begin()end()に等しくなります。ループは単に がend()は、上記正解に別のポイントを追加

+2

+1素晴らしい答え。 – Nawaz

+0

イラストはJosuttisのような臭いです。 – fredoverflow

+1

'begin()'と 'end()'だけでなく、一般に、 '[begin、end]'はイテレータの出所や値の保持場所にかかわらず、値の**シーケンス**を定義します。 –

2

文字通り、配列の末尾を1つ指しているためです。

この要素は空であり、反復することはできますが逆参照はできないために使用されます。

int arry[] = {1, 2, 3, 4, /* end */ }; 
         ^^^^^^^ 
        std::end(arry) would point here. 
+0

配列だけでなく、 'end'イテレータは、イテレータがどこから来たのか、値がどこに保持されているのかにかかわらず、ターゲットシーケンスの終わりを過ぎて指し示します。 –

6

それはコンテナの最後の要素を指していないので、どこか過去へのコンテナの最後の要素。

end()を参照解除すると、結果はであり、未定義の動作になります。

5

数学の間隔と同様に、stlは[begin, end)を使用します。

我々はfor (auto it = v.begin(); it != v.end(); ++it)

+1

はい!コンテナについて言わない最初の答え。シーケンスを作成する必要はありません。 –

2

に達していない限り、引き続き:

  • それは要素を反復ループの終了判定基準が簡単となります。 これは配列と互換性があるためにも行われました。 例:

    char arr[5]; 
    strcpy(arr, "eakgl"); 
    sort(&arr[0], &arr[5]); 
    

    これは正常に動作します。

    sort(&arr[0], &arr[4]); 
    

    を、それが最後の文字を並べ替え逃す:あなたは与えていた場合は代わりに

    これは空のコンテナを自然に表現するのにも役立ちます。

  • 関連する問題