Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是;[ptr,ptr+;len)必须是有效范围“平均值?”? 在C++标准中的不同地方,短语:_C++_Stl_Language Lawyer - Fatal编程技术网

什么是;[ptr,ptr+;len)必须是有效范围“平均值?”? 在C++标准中的不同地方,短语:

什么是;[ptr,ptr+;len)必须是有效范围“平均值?”? 在C++标准中的不同地方,短语:,c++,stl,language-lawyer,C++,Stl,Language Lawyer,要求:[p,p+len)是有效范围 (其中p是指针,len是数字) 迭代器的替代版本是: 要求:[第一个,最后一个)是有效范围 这意味着什么?这意味着第一个包括和p+len或最后一个之间的所有内容都必须是唯一有效的 这一切都取决于C++允许过去数组指针的末尾存在,只要你只使用它们来引用数组的“结束”,而不必对它们进行删除。 因此,如果我有: int my_array[10]; int* first = &my_array[0]; int* last = &my_array[10

要求:
[p,p+len)
是有效范围

(其中p是指针,
len
是数字)

迭代器的替代版本是:

要求:
[第一个,最后一个)
是有效范围


这意味着什么?

这意味着
第一个
包括
p+len
最后一个
之间的所有内容都必须是唯一有效的

这一切都取决于C++允许过去数组指针的末尾存在,只要你只使用它们来引用数组的“结束”,而不必对它们进行删除。 因此,如果我有:

int my_array[10];

int* first = &my_array[0];
int* last = &my_array[10];
然后
first
last
表示一个有效范围,即使
last
在技术上指向无效的地方

同样的原理也适用于迭代器,其中容器的
end()
实际上根本不是容器数据的一部分


乍一看,这一切可能看起来相当奇怪,但这种表示范围的方式允许以合理的方式处理空范围。

我认为
C++17
标准的相关部分就在这里

27.2.1一般[迭代器.requirements.general]

8迭代器
j
可从迭代器
i
调用可到达,当且仅当存在使
i==j
成为
i
的表达式的有限应用程序序列时。如果
j
可从
i
到达
,则它们引用相同se的元素淬火

9大多数在数据结构上操作的库算法模板都有使用范围的接口。范围是一对指定计算开始和结束的迭代器。范围
[i,i)
是空范围;一般来说,范围
[i,j)
指数据结构中的元素,从
i
指向的元素开始,到
j
指向的元素,但不包括
j
指向的元素。范围
[i,j)
当且仅当可从
i
访问
j
时才有效。库中函数应用于无效范围的结果未定义

因此,提取相关部分:

8迭代器
j
从迭代器
i
调用可到达,当且仅当表达式
++i
的应用程序的有限序列使得
i==j

9…范围
[i,j)
在且仅当
j
可从
i
访问时有效

因此,“有效范围”似乎是属于同一容器(或数组)的一对迭代器,
j
i
更远

但也不要忘记:

通常,范围
[i,j)
是指数据结构中的元素,从
i
指向的元素开始,直到但不包括
j
指向的元素


因此
i
j
之间的所有迭代器(但不一定包括
j
必须在“数据结构中”(即不超出范围).

你能详细说明一下吗?你不明白什么?人力资源管理。我找了这个问题,没有找到DUP。其他人比我更擅长搜索。我也准备好了答案。这些都是非常糟糕的DUP目标,完全没有找到“是有效范围”部分。重新打开。“有效”表示允许您访问的范围,不会导致UB。如果混淆是关于间隔符号,那么。这也意味着您可以围绕变量形成一个范围:
int a;int*begin=&a;int*end=&a+1;
:)