gpt4 book ai didi

c++ - 为什么标准迭代器范围是 [begin, end) 而不是 [begin, end]?

转载 作者:IT老高 更新时间:2023-10-28 11:27:37 28 4
gpt4 key购买 nike

为什么标准将 end() 定义为末尾,而不是实际末尾?

最佳答案

最好的论据是Dijkstra himself 提出的论据。 :

  • 您希望范围的大小是一个简单的差异end - begin;

  • 当序列退化为空序列时,包括下限更“自然”,而且因为替代方案(排除下限)需要存在“one-before” -the-beginning"标记值。

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

当您拥有任何类型的算法来处理对基于范围的构造的多个嵌套或迭代调用时,[begin, end) 约定背后的智慧一次又一次地得到返回,这些构造自然地链接在一起。相比之下,使用双重封闭的范围会导致错误和非常不愉快和嘈杂的代码。例如,考虑一个分区 [n0, n1)[n 1, n2)[n2,n3)。另一个例子是标准迭代循环 for (it = begin; it != end;++it),它运行 end - begin 次。如果两端都是包容性的,那么相应的代码的可读性就会大大降低——想象一下你将如何处理空范围。

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

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

关于c++ - 为什么标准迭代器范围是 [begin, end) 而不是 [begin, end]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9963401/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com