3 回答
TA贡献1831条经验 获得超9个赞
最好的论点是Dijkstra自己制作的:
你希望范围的大小是一个简单的差异结束 - 开始 ;
当序列退化为空的时,包括下限更“天然”,并且因为替代(不包括下限)将需要存在“一个在开始之前”的前哨值。
你仍然需要证明为什么你开始计算零而不是一个,但这不是你问题的一部分。
当你有任何类型的算法来处理基于范围的构造的多个嵌套或迭代调用时,[开始,结束]约定背后的智慧会一次又一次地得到回报。相比之下,使用双闭范围将导致一个接一个,并且非常令人不愉快且噪声很大。例如,考虑分区[ n 0,n 1)[ n 1,n 2 ] [ n 2,n 3)。另一个例子是标准迭代循环for (it = begin; it != end; ++it)
,它运行end - begin
时间。如果两端都是包容性的话,相应的代码将更不易读 - 并想象你如何处理空范围。
最后,我们还可以提出一个很好的论据,为什么计数应该从零开始:对于我们刚刚建立的范围的半开公约,如果给出一系列N个元素(比如枚举数组的成员),那么0是自然的“开始”,因此您可以将范围写为[0,N),而不会有任何尴尬的偏移或更正。
简而言之:我们1
在基于范围的算法中看不到任何数字的事实是[开始,结束]约定的直接结果和动机。
TA贡献1906条经验 获得超10个赞
为什么标准定义end()
为一个结束而不是实际结束?
因为:
它避免了对空范围的特殊处理。对于空范围,
begin()
等于end()
&它使遍历元素的循环的结束标准变得简单:只要
end()
未到达,循环就会继续。
- 3 回答
- 0 关注
- 555 浏览
添加回答
举报