【发布时间】:2021-07-11 15:07:15
【问题描述】:
我可以看到std::sort 返回void。但是既然ranges 已添加到C++20 标准中,为什么std::ranges::sort 返回iterator? cppreference 指定:
返回值
一个等于 last 的迭代器。
- 做出这种选择的原因是什么?
- 与
void相比,用例有什么优势?
【问题讨论】:
标签: c++ iterator std c++20 range-v3
我可以看到std::sort 返回void。但是既然ranges 已添加到C++20 标准中,为什么std::ranges::sort 返回iterator? cppreference 指定:
返回值
一个等于 last 的迭代器。
void相比,用例有什么优势?【问题讨论】:
标签: c++ iterator std c++20 range-v3
您不必将结束迭代器传递给std::ranges 中的算法。您可以改为传递一个哨兵,它类似于迭代器,但它本身不是一个迭代器(它不能被取消引用或递增)。想一想,如果您想将一个以 null 结尾的字符串传递给算法,这可能会有什么用处。
std::ranges::sort 在进行排序时必须找到序列的结尾。这是有用的信息,所以它被返回了。
【讨论】:
ranges::sort 返回 end 迭代器的原因是因为这在执行之前是不知道的? ranges 用户似乎一开始并不需要它。我可能错了,但似乎我们正在抵消范围的目的,即“不必专门提供end iter”。
sort 必须计算为排序的副作用,它使用户可以在 O(1) 中访问结束位置。