[英]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;
我們的兩個指針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,但它排除了最終值,所以覆蓋的索引范圍是half-open ,特別是[0, 4)
這些不是 C++ 特定術語,它們是通用數學術語。
[] 和 () 表示范圍是否包含/不包含端點:
大多數 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.