【问题标题】:C++why do constrained algorithms (e.g. std::ranges::merge) also return the end of the input ranges?C++为什么约束算法(例如std::ranges::merge)也返回输入范围的结尾?
【发布时间】:2021-09-29 19:50:02
【问题描述】:

std::ranges::merge(例如)返回一组迭代器,其中显然包含合并范围的结尾,但也包含两个输入范围的结尾。 Cppreference 说 (https://en.cppreference.com/w/cpp/algorithm/ranges)

此外,大多数算法的返回类型已更改为返回算法执行期间计算的所有潜在有用信息。

返回输入范围的结尾有什么意义?

【问题讨论】:

    标签: c++ c++20 std-ranges


    【解决方案1】:

    我想引用 Alexander Stepanov 的话:

    在编写代码时,通常会计算出调用函数当前不需要的值。但是,稍后,当在不同情况下调用代码时,此值可能很重要。在这种情况下,您应该遵守有用回报法则:一个过程应该返回它计算出的所有潜在有用信息。

    回到问题:

    返回输入范围的结尾有什么意义?

    算法计算了它的输入范围的结束,这可能不一定是一个便宜的计算,并且可能对用户有用的信息,所以它应该返回它。

    例如,您的输入范围可能是一个以 null 结尾的字符串,其标记是一个用于检查字符是否为 '\0' 的谓词。该算法可能会做一些工作,但在此过程中有效地计算strlen。如果用户正在对字符串做进一步的工作,这可能是有用的信息!

    更一般地说,返回一个迭代器意味着采用迭代器/哨兵对的算法现在可以有效地将该范围升级为迭代器/迭代器对。

    【讨论】:

    • 我认为如果明确指出,在范围库中,您可以指定范围的结束,而实际上没有结束迭代器,我认为这个答案会更清楚。相反,您现在只需要一个在迭代器到达末尾时识别的对象(哨兵)。这是与以前的 C++ 相比的“最大”变化。 因为你有这种额外的灵活性,“找到结束迭代器”是一个有意义的计算,因为在旧式 API 中你被假定已经拥有它。
    猜你喜欢
    • 2021-02-18
    • 2020-01-11
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2020-12-31
    • 2021-05-11
    相关资源
    最近更新 更多