什么是半开放范围和最终值

时间:2012-10-25 10:45:55

标签: c++ c math language-agnostic terminology

这些术语在C ++中意味着什么?

1.关闭end

2.半开放范围 - [begin, off_the_end)

我在阅读有关循环时遇到过它们。

3 个答案:

答案 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;

我们的两个指针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,但它排除了结束值,因此涵盖的索引范围是半开,特别是[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 ++惯例