【问题标题】:Why does ranges::sort return an iterator?为什么 range::sort 返回一个迭代器?
【发布时间】:2021-07-11 15:07:15
【问题描述】:

我可以看到std::sort 返回void。但是既然ranges 已添加到C++20 标准中,为什么std::ranges::sort 返回iterator? cppreference 指定:

返回值

一个等于 last 的迭代器。

  1. 做出这种选择的原因是什么?
  2. 与void相比,用例有什么优势?

【问题讨论】:

    标签: c++ iterator std c++20 range-v3


    【解决方案1】:

    您不必将结束迭代器传递给std::ranges 中的算法。您可以改为传递一个哨兵,它类似于迭代器,但它本身不是一个迭代器(它不能被取消引用或递增)。想一想,如果您想将一个以 null 结尾的字符串传递给算法,这可能会有什么用处。

    std::ranges::sort 在进行排序时必须找到序列的结尾。这是有用的信息,所以它被返回了。

    【讨论】:

    • 我很困惑。 ranges::sort 返回 end 迭代器的原因是因为这在执行之前是不知道的? ranges 用户似乎一开始并不需要它。我可能错了,但似乎我们正在抵消范围的目的,即“不必专门提供end iter”。
    • 我会说,对于链接......但返回(初始)范围似乎更自然......
    • 分隔范围的结尾可以在 O(N) 中找到,所以从技术上讲是的,它不需要。但是通过返回结束的位置,sort 必须计算为排序的副作用,它使用户可以在 O(1) 中访问结束位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2017-03-19
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多