什么是一半的开放范围和末端值
What is half open range and off the end value
这些术语在C 中是什么意思?
1.
off end
value
2.
半开放范围-[begin, off_the_end)
我在阅读循环时遇到了它们。
半开范围是一个包括第一个元素,但不包括最后一个元素。
范围[1,5)是半开的,由值1、2、3和4组成。
"结束"或"过去"仅指序列结束后的元素,并且很特别,因为允许迭代器指向它(但您可能不会查看实际值,因为它不存在)
例如,在以下代码中:
char arr[] = {'a', 'b', 'c', 'd'};
char* first = arr
char* last = arr + 4;
first
现在指向数组的第一个元素,而last
点超过数组的末端。我们被允许 point 超过数组末端(但不是二过去),但是我们不允许尝试在该位置访问该元素:
// 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 (int i = 0; i < 4; ++i) {
// do something with arr[i]
}
此循环从0到4,但排除最终值,因此所涵盖的索引范围是 half half-open ,特别是 [0, 4)
这些不是C 特定术语,它们是一般数学术语。
[]和()表示范围是否包含/不包括端点:
- [包括端点
- (不包括端点
- [] ='关闭',包括两个端点
- ()='open',不包括两个端点
- [)和(]均为"半开",仅包括一个端点
大多数C for-loops覆盖了半开的范围(您包括第一个元素:例如for int i=0;
,但排除最终元素:i < foo
,而不是i ≤ foo
)
,如其他答案所述,半开范围也是该术语在编程上下文中的数学术语和用法暗示起点是包括,终点为排除。
在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
函数,因为它在功能签名中很明显,指向数组(或数组本身)的第一个元素的指针以及数组的大小。/p>
但是,正如我上面写的那样,我们还可以使用函数签名中的半开范围,如下所示;
#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-loop结束,不包括处理end
。我称之为半开范围。
半开范围是 C 会议。
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 不计算一个范围内的完美数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 如何访问超出其块范围的对象?
- 什么是一半的开放范围和末端值