“[ptr,ptr + len]必须是有效范围”是什么意思?

时间:2018-05-21 18:03:32

标签: c++ stl language-lawyer

在c ++标准的各个地方,短语:

要求: len是有效范围。

(其中p是指针,[first, last)是数字)。

迭代器的替代版本是:

要求: <% @interest = Interest.new(hobby_id: hobby.id, user_id: @user.id) %> <%= link_to 'Create', new_interest_path, method: :get, class: "btn btn-primary" %> 是有效范围。

这是什么意思?

2 个答案:

答案 0 :(得分:2)

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

  

27.2.1 一般 [ iterator.requirements.general ]

     

...

     

8 迭代器j在迭代器i中被称为 可到达 当且仅当有,表达++i的有限的应用程序序列i == j。如果来自j的{​​{1}} 可以 ,则它们会引用相同序列的元素。

     

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

因此提取相关部分:

  

8 迭代器i在迭代器j中被称为 可到达 当且仅当有,表达式i的有限应用序列,使++i ...

     

9 ...范围i == j有效且当且仅当[i, j)可以j到达时才有效。

所以似乎有效范围&#34;是一对属于相同容器(或数组)的迭代器ij更远。

但也不要忘记:

  

通常,范围i是指数据结构中的元素,以[i, j)指向的元素开头,但最多但不包括i指向的元素。

所以ji之间的所有迭代器(但不一定包括j必须为&#34 ;在数据结构中&#34; (即不是越界)

答案 1 :(得分:1)

这意味着{this.state.subCatagory.map((subCatagory, idx) => ( <div className="subCatagory" key={idx}> <input type="text" placeholder={`Enter Dish #${idx + 1} name`} value={subCatagory.name} onChange={this.handlesubCatagoryNameChange(idx)} /> <input type="number" placeholder={`subCatagory #${idx + 1} price`} value={subCatagory.price} onChange={this.handlesubCatagoryPriceChange(idx)} /> <button type="button" onClick={this.handleRemovesubCatagory(idx)} className="small" > Delete </button> <button type="button" onClick={this.addNewCust(idx)} className="small"> is cust availble? </button> {subCatagory.customize.map((gj, idx) => ( <div key={idx}> <input type="number" placeholder={`subCatagory #${idx + 1} price`} value={gj.name} onChange={this.gjj(idx)} /> </div> ))} </div> ))} 包含firstp+len 完全之间的所有内容都必须有效。

这一切都取决于C ++允许存在数组指针的过去,只要您只使用它们来引用数组的“结尾”而不取消引用它们。

所以,如果我有:

last

然后int my_array[10]; int* first = &my_array[0]; int* last = &my_array[10]; first代表有效范围,即使last在技术上指向无处有效。

同样的原则适用于迭代器,其中容器的last实际上并不是容器数据的一部分。

乍一看这一切看起来都很奇怪,但这种表示范围的方式允许以理智的方式处理空范围。