首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >半开范围和非终值是什么?

半开范围和非终值是什么?
EN

Stack Overflow用户
提问于 2012-10-25 18:45:55
回答 3查看 10.9K关注 0票数 24

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

end值执行1.操作

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

我在阅读有关for循环的文章时遇到了它们。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-25 18:58:54

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

范围[ 1,5]是半开的,由值1、2、3和4组成。

"off the end“或"past the end”指的是紧跟在序列末尾的元素,它的特殊之处在于允许迭代器指向它(但您可能看不到实际值,因为它不存在)。

例如,在以下代码中:

代码语言:javascript
运行
复制
char arr[] = {'a', 'b', 'c', 'd'};

char* first = arr
char* last = arr + 4;

first现在指向数组的第一个元素,而last指向数组末尾的另一个元素。我们被允许指向数组末尾的最后一位(但不能超过两位),但我们不能尝试访问该位置的元素:

代码语言:javascript
运行
复制
// 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,我会这样做:

代码语言:javascript
运行
复制
std::copy(first, last, dest)

一个简单的for循环通常遵循类似的模式:

代码语言:javascript
运行
复制
for (int i = 0; i < 4; ++i) {
    // do something with arr[i]
}

这个循环从0到4,但它排除了结束值,因此覆盖的索引范围是半开放的,特别是[0, 4)

票数 36
EN

Stack Overflow用户

发布于 2012-10-25 18:52:08

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

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

  • [包括终结点
  • (排除终结点
  • []= 'Closed',包括两个终结点
  • () = 'Open',排除两个终结点
  • )和(均为‘半开放’,仅包括一个终结点

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

票数 23
EN

Stack Overflow用户

发布于 2017-02-15 17:12:08

正如在其他答案中所解释的,半开域也是一个数学术语,并且在编程上下文中使用该术语,这意味着起点是included,而终点是excluded

在C/C++编程的上下文中,它实际上是什么意思?比方说,您将打印整数数组的元素。对于C语言,因为您对数组的大小没有任何运行时知识,所以您有两个选择。要么你必须提供数组的大小,因此函数签名将如下所示;

代码语言:javascript
运行
复制
void printArray(int * array, int size);

或者,您必须使用半开范围,这意味着,除了数组本身之外,您还必须提供开始和结束指针(并且函数将处理包括开始,不包括结束的指针)。函数签名如下;

代码语言:javascript
运行
复制
void printArray(int * array, int * begin, int * end);

为了说明这一点,这里有一个提供数组大小的示例;

代码语言:javascript
运行
复制
#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函数传递了两个参数,因为它在函数签名上很明显,指向数组的第一个元素(或数组本身)的指针和数组的大小。

然而,正如我上面所写的,我们也可以在函数签名中使用半开范围,如下所示;

代码语言:javascript
运行
复制
#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;
}

这两个代码将产生相同的输出,如下所示;

代码语言:javascript
运行
复制
Array:  1  2  3  4  5

如您所见,printArray函数打印范围[begin, end)的函数。index实际上是指向整数数组元素的指针,从begin开始,它包括begin,当index等于end指针时,for循环结束,不包括处理end。这就是我所谓的半开放范围

半开放范围C++约定

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13066884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档