为了账号安全,请及时绑定邮箱和手机立即绑定

为什么标准迭代器范围[开始,结束]而不是[开始,结束]?

为什么标准迭代器范围[开始,结束]而不是[开始,结束]?

C++
回首忆惘然 2019-08-06 15:18:24
为什么标准迭代器范围[开始,结束]而不是[开始,结束]?为什么标准定义end()为一个结束而不是实际结束?
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

最好的论点是Dijkstra自己制作的

  • 你希望范围的大小是一个简单的差异结束  -  开始 ;

  • 当序列退化为空的时,包括下限更“天然”,并且因为替代(不包括下限)将需要存在“一个在开始之前”的前哨值。

你仍然需要证明为什么你开始计算零而不是一个,但这不是你问题的一部分。

当你有任何类型的算法来处理基于范围的构造的多个嵌套或迭代调用时,[开始,结束]约定背后的智慧会一次又一次地得到回报。相比之下,使用双闭范围将导致一个接一个,并且非常令人不愉快且噪声很大。例如,考虑分区[ 01)[ 12 ] [ 23)。另一个例子是标准迭代循环for (it = begin; it != end; ++it),它运行end - begin时间。如果两端都是包容性的话,相应的代码将更不易读 - 并想象你如何处理空范围。

最后,我们还可以提出一个很好的论据,为什么计数应该从零开始:对于我们刚刚建立的范围的半开公约,如果给出一系列N个元素(比如枚举数组的成员),那么0是自然的“开始”,因此您可以将范围写为[0,N),而不会有任何尴尬的偏移或更正。

简而言之:我们1在基于范围的算法中看不到任何数字的事实是[开始,结束]约定的直接结果和动机。


查看完整回答
反对 回复 2019-08-06
?
隔江千里

TA贡献1906条经验 获得超10个赞

为什么标准定义end()为一个结束而不是实际结束?

因为:

  1. 它避免了对空范围的特殊处理。对于空范围,begin()等于 end()

  2. 它使遍历元素的循环的结束标准变得简单:只要end()未到达,循环就会继续。


查看完整回答
反对 回复 2019-08-06
  • 3 回答
  • 0 关注
  • 555 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信