これらの用語は C++ で何を意味しますか?
1.
オフザend
バリュー
2.
ハーフオープンレンジ -[begin, off_the_end)
for ループについて読んでいるときに、それらに出くわしました。
これらの用語は C++ で何を意味しますか?
1.
オフザend
バリュー
2.
ハーフオープンレンジ -[begin, off_the_end)
for ループについて読んでいるときに、それらに出くわしました。
半開きの範囲は、最初の要素を含み、最後の要素を除外する範囲です。
範囲 [1,5) は半開きで、値 1、2、3、および 4 で構成されます。
「off the end」または「past the end」は、シーケンスの末尾の直後の要素を指し、反復子がそれを指すことができるという点で特別です (ただし、実際の値は参照できないため、実際の値を確認することはできません)。存在しない)
たとえば、次のコードでは:
char arr[] = {'a', 'b', 'c', 'd'};
char* first = arr
char* last = arr + 4;
first
は配列の最初の要素を指すようになり、配列の末尾の 1 つ後ろlast
を指します。配列の末尾から 1 つ後ろを指すことはできますが ( 2 つ後ろを指すことはできません)、その位置にある要素にアクセスすることはできません。
// legal, because first points to a member of the array
char firstChar = *first;
// illegal because last points *past* the end of the array
char lastChar = *last;
2 つのポインターは、それらの間のすべての要素の範囲first
をlast
一緒に定義します。
半分開いた範囲の場合、 が指すfirst
要素とその間のすべての要素が含まれますが、 が指す要素は含まれlast
ません (実際には有効な要素を指していないため、これは良いことです)。
C++ では、すべての標準ライブラリ アルゴリズムがこのような半開きの範囲で動作します。たとえば、配列全体を別の場所にコピーする場合は、次のようdest
にします。
std::copy(first, last, dest)
単純な for ループは通常、同様のパターンに従います。
for (int i = 0; i < 4; ++i) {
// do something with arr[i]
}
このループは 0 から 4 まで進みますが、終了値を除外するため、対象となるインデックスの範囲は半分開いています。具体的には[0, 4)
これらは C++ 固有の用語ではなく、一般的な数学用語です。
[] と () は、範囲がエンドポイントを含むか含まないかを示します。
ほとんどの C++ for ループは、半分開いた範囲をカバーします (最初の要素を含めます: 例:for int i=0;
が、最後の要素を除外します: i < foo
, not i ≤ foo
)