24

这些术语在 C++ 中是什么意思?

1.偏离end价值

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

我在阅读 for 循环时遇到了它们。

4

3 回答 3

38

半开范围是包含第一个元素但不包括最后一个元素的范围。

范围 [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,但它不包括结束值,所以涵盖的索引范围是half-open,特别是[0, 4)

于 2012-10-25T10:58:53.613 回答
23

这些不是 C++ 特定的术语,它们是一般的数学术语。

[] 和 () 表示范围是否包含/不包含端点:

  • [ 包括端点
  • ( 不包括端点
  • [] = '已关闭',包括两个端点
  • () = 'Open',不包括两个端点
  • [) 和 (] 都是“半开”的,并且只包含一个端点

大多数 C++ for 循环覆盖半开范围(您包括第一个元素:例如for int i=0;,但不包括最后一个元素:i < foo,不i ≤ foo

于 2012-10-25T10:52:08.173 回答
1

正如在其他答案中所解释的那样,半开范围也是一个数学术语,并且在编程上下文中使用该术语,暗示包括起点并且包括终点。

在 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函数打印 range 的函数[begin, end)。这index实际上是一个指向整数数组元素的指针,从 开始begin,它包括 ,当等于指针begin时,for循环结束,不包括处理。我称之为半开范围indexendend

半开范围C++ 约定

于 2017-02-15T09:12:07.643 回答