C++为什么约束算法(例如std::ranges::merge)也返回输入范围的结尾?
std::ranges::merge(例如)返回包含合并范围结束的一组迭代器,显然,但也包含两个输入范围的结束。Cppreference 说(https://en.cppreference.com/w/cpp/algorithm/ranges)
此外,大多数算法的返回类型已更改为返回在算法执行期间计算的所有潜在有用信息。
返回输入范围的末尾有什么意义?
回答
我想引用亚历山大·斯捷潘诺夫的话:
在编写代码时,通常情况下您最终会计算出调用函数当前不需要的值。但是,稍后在不同情况下调用代码时,此值可能很重要。在这种情况下,您应该遵守有用返回定律:一个过程应该返回它计算出的所有潜在有用的信息。
回到问题:
返回输入范围的末尾有什么意义?
该算法计算了其输入范围的结束,这可能不一定是计算成本低的事情,而且这可能是用户拥有的有用信息,因此它应该只返回它。
例如,您的输入范围可能是一个以空字符结尾的字符串,带有一个标记,它是一个检查字符是否为 的谓词' '。该算法可能会做一些工作,但在此过程中也有效地计算strlen。如果用户正在对字符串做进一步的工作,这可能是有用的信息!
更一般地说,返回迭代器意味着采用迭代器/哨兵对的算法现在可以有效地将该范围升级为迭代器/迭代器对。
- 我认为这个答案可能会更清楚,如果它明确指出,在范围库中,您可以指定范围的结束,而实际上没有结束迭代器。相反,您现在只需要一个对象(哨兵),当迭代器到达终点时*识别*。这是与以前的 C++ 相比的“重大变化”。*因为*你有这种额外的灵活性,“找到最终迭代器”是一个有意义的计算,因为在旧式 API 中,你被假定已经拥有它。
THE END
二维码