std::ranges::upper_bound
这样的算法,我看到了两种实现:
这是一种遗留问题还是我应该实现这两个版本以便使用范围和迭代器?
我的意思是,是否存在客户端无法将一种接口转换为另一种接口并仅使用一个接口的情况?或者有两个接口比在客户端转换更方便?
我的理解是,基于范围的版本是自然的,并且是
std::ranges
库唯一需要的,而基于迭代器哨兵的版本仅出于兼容性原因而提供,以兼容先前基于迭代器的 STL 算法。主要区别在于,基于范围的版本应该支持视图、投影的惰性求值,而基于迭代器的版本则不应该支持。这是正确的吗?
如果不是,正确答案是什么?
它们都可以根据对方来实现。
如果您有一个范围并想要调用基于迭代器的版本,只需使用
std::ranges::begin(r), std::ranges::end(r)
调用基于迭代器的版本即可。
如果您有迭代器-哨兵对,您可以使用
std::ranges::subrage(first, last)
调用基于范围的版本。
它们在技术上是多余的。两个重载都比另一个重载支持更多或更少,例如他们都可以接受恰好是视图的范围。
一般来说,基于范围的重载只是调用基于迭代器-哨兵对的重载。我相信提供范围过载只是为了方便,您也应该提供它,以免令人惊讶。