の意味は誰でも説明できますpast-the-end
。end()
関数を最後まで呼び出すのはなぜですか?
5 に答える
関数begin()
とは半開きの range( )end()
を定義します。つまり
、範囲には最初の要素が含まれますが、最後の要素は除外されます。したがって、終わりを過ぎた名前。[begin, end)
ハーフ オープン レンジの利点は次のとおりです。
空の範囲に対する特別な処理を回避します。空の範囲の場合、
begin()
は と等しくなりend()
ます。これにより、要素を反復するループの終了基準が単純になります。ループ
end()
は、到達しない限り継続します。
コンテナの最後の要素を指しているのではなく、コンテナの最後の要素を超えた場所を指しているからです。
逆参照end()
すると、未定義の動作になります。
数学の間隔のように、stl は を使用し[begin, end)
ます。
それが私たちが書くことができる理由ですfor (auto it = v.begin(); it != v.end(); ++it)
上記の正解に別のポイントを追加します。これは、アレイとの互換性を保つためにも行われました。たとえば、次のコードでは次のようになります。
char arr[5];
strcpy(arr, "eakgl");
sort(&arr[0], &arr[5]);
これは正常に機能します。
代わりにあなたが与えた場合:
sort(&arr[0], &arr[4]);
最後の文字のソートを見逃してしまいます。
これは、空のコンテナを自然に表現するのにも役立ちます。
文字通り、配列の終わりを1つ過ぎたところを指しているためです。
その要素が空であり、反復することはできますが、逆参照することはできないため、これが使用されます。
int arry[] = {1, 2, 3, 4, /* end */ };
^^^^^^^
std::end(arry) would point here.