目前,std::advance
是这样设计的:
template< class InputIt, class Distance >
void advance( InputIt& it, Distance n );
但是,我经常发现自己想要这样的东西:
template< class InputIt, class Distance >
InputIt advance( InputIt it, Distance n );
那么,当前设计背后的基本原理是什么?这是出于某些性能考虑吗?请注意,std::next
和 std::prev
会返回结果迭代器。
最佳答案
没有技术原因阻止它返回对输入值的引用,如果不使用返回值,任何合理的编译器都应该能够优化它。因此,如果他们愿意,他们可以那样做。
我认为他们的选择从 API 设计的角度来看是有意义的 - std::prev
和 std::next
接受一个迭代器并返回一个不同的迭代器指向分别指向上一个或下一个元素,无需修改输入。
std::advance
另一方面修改输入。如果它返回对输入迭代器的引用,它可能会混淆一个返回拷贝而不修改输入的函数。这可能是危险的。
请注意 std::advance
与 InputIterator
一起工作,其中包括迭代器,其中迭代器具有副作用(例如从流中读取的迭代器),但是 std::prev
和 std::next
仅适用于 ForwardIterator
,它们没有副作用。
因此返回一个单独的值(如std::prev
和std::next
)将不是一个好主意——你会最终在同一个流上有两个迭代器,这可能会相互影响。
关于c++ - 为什么 std::advance 不返回结果迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30966040/