什么是半开放范围和最终值
这些术语在C ++中意味着什么?
1.
end
价值
2.
半开范围 – [begin, off_the_end)
我在阅读有关循环时遇到过它们。
半开范围是包含第一个元素的范围,但不包括最后一个元素。
范围[1,5]是半开的,由值1,2,3和4组成。
“越过末尾”或“越过末尾”是指序列结束后的元素,并且特殊之处在于允许迭代器指向它(但你可能不会看实际值,因为它没有’存在)
例如,在以下代码中:
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,但是它排除了结束值,所以覆盖的索引范围是半开的 ,特别是[0, 4)
这些不是C ++特定术语,它们是一般数学术语。
[]和()表示范围是否包含/排除端点:
- [包括端点
- (不包括终点
- [] =’已关闭’,包括两个端点
- ()=’打开’,排除两个端点
- [)和(]都是“半开”,并且只包含一个端点
大多数C ++ for循环覆盖半开范围(包括第一个元素:例如for int i=0;
但是排除最后一个元素: i < foo
,而不是i ≤ foo
)
正如其他答案所解释的那样, 半开范围也是一个数学术语,并且在编程环境中使用该术语,暗示包括起点并排除终点。
它在C / C ++编程环境中实际意味着什么? 假设您要打印整数数组的元素。 说到C语言,因为你没有任何关于数组大小的运行时知识,你有两个选择。 您必须提供数组的大小,因此,函数签名将如下所示;
void printArray(int * array, int size);
或者你必须使用半开放范围 ,这意味着你必须提供数组本身的开始和结束指针(并且函数将包括开始,不包括结束)。 function签名如下;
void printArray(int * array, int * begin, int * end);
为了说明,这里是一个提供数组大小的例子;
#include 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 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
和for循环,当index
等于end
指针时end
,不包括处理end
。 我称之为半开放范围 。
半开放范围是C ++约定 。