簡體   English   中英

什么是半開范圍和離終值

[英]What is half open range and off the end value

這些術語在 C++ 中是什么意思?

1.關閉end

2.半開放范圍 - [begin, off_the_end)

我在閱讀 for 循環時遇到了它們。

半開范圍是包含第一個元素但不包括最后一個元素的范圍。

范圍 [1,5) 是半開的,由值 1、2、3 和 4 組成。

"off the end" 或 "pass the end" 指的是序列末尾之后的元素,它的特殊之處在於允許迭代器指向它(但您可能不會查看實際值,因為它沒有存在)

例如,在以下代碼中:

char arr[] = {'a', 'b', 'c', 'd'};

char* first = arr
char* last = arr + 4;

first現在指向數組的第一個元素,而last指向數組末尾之后的一個元素。 我們可以指向數組末尾的一個(但不能指向兩個),但我們不能嘗試訪問該位置的元素:

// 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;

我們的兩個指針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,但它排除了最終值,所以覆蓋的索引范圍是half-open ,特別是[0, 4)

這些不是 C++ 特定術語,它們是通用數學術語。

[] 和 () 表示范圍是否包含/不包含端點:

  • [ 包括端點
  • ( 不包括端點
  • [] = 'Closed',包括兩個端點
  • () = 'Open', 排除兩個端點
  • [) 和 (] 都是“半開”的,並且只包含一個端點

大多數 C++ for 循環覆蓋半開范圍(包括第一個元素:例如for int i=0; ,但排除最后一個元素: i < foo ,而不是i ≤ foo

正如在其他答案中所解釋的,半開范圍也是一個數學術語,並且在編程上下文中使用該術語,這意味着包括起點而排除終點。

在 C/C++ 編程的上下文中它實際上意味着什么? 假設您要打印整數數組的元素。 對於 C 語言,因為您對數組的大小沒有任何運行時知識,所以您有兩種選擇。 您必須提供數組的大小,因此函數簽名將如下所示;

void printArray(int * array, int size);

或者您必須使用half-open range ,這意味着您必須提供數組本身之外的開始和結束指針(並且函數將處理包括開始,不包括結束)。 函數簽名如下;

void printArray(int * array, int * begin, int * end);

為了說明,這里是提供數組大小的示例;

#include <stdio.h>

void printArray(int * array, int size)
{
    printf("Array: ");

    for(int i = 0; i < size; i++)
        printf("%2d ", array[i]);

    printf("\n");
}

int main()
{
    int array[5] = { 1, 2, 3, 4, 5 };

    printArray(array, 5);

    return 0;
}

在上面的例子中,我們已經向printArray函數傳遞了兩個參數,這在函數簽名中很明顯,指向數組第一個元素(或數組本身)的指針,以及數組的大小。

但是,正如我上面寫的,我們也可以在函數簽名中使用半開范圍,如下所示;

#include <stdio.h>

void printArray(int * array, int * begin, int * end)
{
    printf("Array: ");

    for(int * index = begin; index != end; index++)
        printf("%2d ", *index);

    printf("\n");
}

int main()
{
    int array[5] = { 1, 2, 3, 4, 5 };

    printArray(array, array, array+5);

    return 0;
}

兩個代碼將產生相同的輸出,如下所示;

Array:  1  2  3  4  5

如您所見, printArray函數打印[begin, end)范圍內的函數。 index實際上是指向整數數組元素的指針,從begin ,它包括begin ,當index等於end指針時 for 循環結束,不包括處理end 這我稱之為半開范圍

半開范圍C++ 約定

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM