为什么标准中的范围是 [begin, end) 而不是 [begin, end]
在标准中,end()函数被定义为超过范围的末尾而不是实际的末尾。这一决定一直是争论的主题,并提出了几个令人信服的理由来为其辩护。
主要论点之一,正如 Dijkstra 雄辩地指出的那样,集中在计算差异范围大小的简单性上结束和开始之间。此外,包含下限(开始)被认为更自然,特别是在序列退化为空序列的情况下。相反,排除下限将需要引入“开始前一个”标记值,这会引入不必要的复杂性。
[begin, end) 约定还简化了嵌套或迭代调用基于范围的构造,使它们能够自然地链接。相反,双闭范围会导致相差一的错误以及繁琐且嘈杂的代码。例如,考虑 [n0, n1)[n 的分区1, n2)[n2,n3)。
类似地,标准迭代循环 for (it = begin; it != end; it)执行结束 - 开始时间。如果两端都包含在内,那么可读性就会大大降低,尤其是在处理空范围时。
最后,从零开始的计数约定与 [begin, end) 方法很好地保持一致。当呈现 N 个元素的范围(例如数组的元素)时,零作为自然的“开始”,允许该范围表示为 [0, N),避免不必要的偏移或更正。
总之,范围中的 [begin, end) 约定是经过仔细考虑的设计选择的结果。它确保范围大小计算的简单性、处理空序列时的自然性、易于处理嵌套的基于范围的结构以及与从零开始的计数对齐。
以上是为什么标准范围使用半开区间 [begin, end) 而不是闭区间 [begin, end]?的详细内容。更多信息请关注PHP中文网其他相关文章!