这些术语在C++中是什么意思?
对end
值执行1.
操作
2.
半开放范围- [begin, off_the_end)
我在阅读有关for循环的文章时遇到了它们。
发布于 2012-10-25 10:58:54
半开范围是包含第一个元素,但不包括最后一个元素的范围。
范围[ 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
现在指向数组的第一个元素,而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)
发布于 2012-10-25 10:52:08
这些不是C++特定的术语,它们是一般的数学术语。
[]和()表示范围是否包括/不包括端点:
大多数C++ -循环覆盖半开范围(包括第一个元素:例如for int i=0;
,但排除最后一个元素:i < foo
,而不是i ≤ foo
)
发布于 2017-02-15 09:12:08
正如在其他答案中所解释的,半开域也是一个数学术语,并且在编程上下文中使用该术语,这意味着起点是included,而终点是excluded。
在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
等于end
指针时,for循环结束,不包括处理end
。这就是我所谓的半开放范围。
半开放范围是C++约定。
https://stackoverflow.com/questions/13066884
复制