25

の意味は誰でも説明できますpast-the-endend()関数を最後まで呼び出すのはなぜですか?

4

5 に答える 5

50

関数begin()とは半開きの range( )end()を定義します。つまり 、範囲には最初の要素が含まれますが、最後の要素は除外されます。したがって、終わりを過ぎた名前。[begin, end)

ここに画像の説明を入力

ハーフ オープン レンジの利点は次のとおりです。

  1. 空の範囲に対する特別な処理を回避します。空の範囲の場合、begin()は と等しくなり end()ます。

  2. これにより、要素を反復するループの終了基準が単純になります。ループend()は、到達しない限り継続します。

于 2013-03-06T16:03:36.627 に答える
7

コンテナの最後の要素を指しているのではなく、コンテナの最後の要素を超えた場所を指しているからです。

逆参照end()すると、未定義の動作になります。

于 2013-03-06T15:55:33.790 に答える
5

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

それが私たちが書くことができる理由ですfor (auto it = v.begin(); it != v.end(); ++it)

于 2013-03-06T16:01:23.167 に答える
2

上記の正解に別のポイントを追加します。これは、アレイとの互換性を保つためにも行われました。たとえば、次のコードでは次のようになります。

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

これは正常に機能します。

代わりにあなたが与えた場合:

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

最後の文字のソートを見逃してしまいます。

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

于 2013-03-06T16:09:37.967 に答える
2

文字通り、配列の終わりを1つ過ぎたところを指しているためです。

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

int arry[] = {1, 2, 3, 4, /* end */ };
                         ^^^^^^^
                    std::end(arry) would point here.
于 2013-03-06T15:55:30.530 に答える