【发布时间】:2021-09-29 19:50:02
【问题描述】:
std::ranges::merge(例如)返回一组迭代器,其中显然包含合并范围的结尾,但也包含两个输入范围的结尾。 Cppreference 说 (https://en.cppreference.com/w/cpp/algorithm/ranges)
此外,大多数算法的返回类型已更改为返回算法执行期间计算的所有潜在有用信息。
返回输入范围的结尾有什么意义?
【问题讨论】:
标签: c++ c++20 std-ranges
std::ranges::merge(例如)返回一组迭代器,其中显然包含合并范围的结尾,但也包含两个输入范围的结尾。 Cppreference 说 (https://en.cppreference.com/w/cpp/algorithm/ranges)
此外,大多数算法的返回类型已更改为返回算法执行期间计算的所有潜在有用信息。
返回输入范围的结尾有什么意义?
【问题讨论】:
标签: c++ c++20 std-ranges
我想引用 Alexander Stepanov 的话:
在编写代码时,通常会计算出调用函数当前不需要的值。但是,稍后,当在不同情况下调用代码时,此值可能很重要。在这种情况下,您应该遵守有用回报法则:一个过程应该返回它计算出的所有潜在有用信息。
回到问题:
返回输入范围的结尾有什么意义?
算法计算了它的输入范围的结束,这可能不一定是一个便宜的计算,并且可能对用户有用的信息,所以它应该返回它。
例如,您的输入范围可能是一个以 null 结尾的字符串,其标记是一个用于检查字符是否为 '\0' 的谓词。该算法可能会做一些工作,但在此过程中有效地计算strlen。如果用户正在对字符串做进一步的工作,这可能是有用的信息!
更一般地说,返回一个迭代器意味着采用迭代器/哨兵对的算法现在可以有效地将该范围升级为迭代器/迭代器对。
【讨论】: