这些术语在C ++中意味着什么?
1.
关闭end
值
2.
半开放范围 - [begin, off_the_end)
我在阅读有关循环时遇到过它们。
答案 0 :(得分:28)
半开范围是包含第一个元素的范围,但不包括最后一个元素。
范围[1,5]是半开放的,由值1,2,3和4组成。
“越过末尾”或“越过末尾”是指在序列结束之后的元素,并且特殊之处在于允许迭代器指向它(但你可能不会看看实际值,因为它不存在)
例如,在以下代码中:
char arr[] = {'a', 'b', 'c', 'd'};
char* first = arr
char* last = arr + 4;
first
现在指向数组的第一个元素,而last
指向一个超过数组末尾的。我们被允许指向一个超过数组的结尾(但不是两个过去),但我们不允许尝试访问该位置的元素:< / p>
// 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)
答案 1 :(得分:18)
这些不是C ++特定术语,它们是一般数学术语。
[]和()表示范围是否包含端点:
大多数C ++ for-loops覆盖半开范围(包括第一个元素:例如for int i=0;
,但排除最后一个元素:i < foo
,而不是i ≤ foo
)
答案 2 :(得分:1)
正如其他答案所解释的,半开放范围也是编程上下文中这个术语的数学术语和用法,暗示起点是< strong>包含,结束点排除。
在C / C ++编程环境中它实际意味着什么?假设您要打印整数数组的元素。说到C语言,因为你没有任何关于数组大小的运行时知识,你有两个选择。您必须提供数组的大小,因此,函数签名将如下所示;
void printArray(int * array, int size);
或者你必须使用半开放范围,这意味着,你必须同时提供开始和结束指针(并且函数将包括开始处理,不包括结束)数组本身。 功能签名将如下所示;
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
时for循环结束等于end
指针,不包括处理end
。我称之为半开放范围。
半开放范围是 C ++惯例。