24

これらの用語は C++ で何を意味しますか?

1.オフザendバリュー

2.ハーフオープンレンジ -[begin, off_the_end)

for ループについて読んでいるときに、それらに出くわしました。

4

3 に答える 3

38

半開きの範囲は、最初の要素を含み、最後の要素を除外する範囲です。

範囲 [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 つのポインターは、それらの間のすべての要素の範囲firstlast一緒に定義します。

半分開いた範囲の場合、 が指す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)

于 2012-10-25T10:58:53.613 に答える
23

これらは C++ 固有の用語ではなく、一般的な数学用語です。

[] と () は、範囲がエンドポイントを含むか含まないかを示します。

  • [エンドポイントを含む
  • (エンドポイントを除く
  • [] = 'Closed'、両方のエンドポイントを含む
  • () = 'オープン'、両方のエンドポイントを除外
  • [) と (] は両方とも「半開き」であり、1 つのエンドポイントのみを含みます

ほとんどの C++ for ループは、半分開いた範囲をカバーします (最初の要素を含めます: 例:for int i=0;が、最後の要素を除外します: i < foo, not i ≤ foo)

于 2012-10-25T10:52:08.173 に答える