Lin*_*gxi 5 c++ iterator c++-standard-library
目前,std::advance设计如下:
template< class InputIt, class Distance >
void advance( InputIt& it, Distance n );
Run Code Online (Sandbox Code Playgroud)
但是,我经常发现自己想要这样的东西:
template< class InputIt, class Distance >
InputIt advance( InputIt it, Distance n );
Run Code Online (Sandbox Code Playgroud)
那么,当前设计背后的原理是什么?这是出于性能方面的考虑吗?注意,std::next并std::prev返回返回的迭代器。
没有技术原因阻止它返回对输入值的引用,并且任何合理的编译器都应该能够优化返回值(如果不使用它)。所以如果他们愿意的话,他们可以这样做。
我认为从 API 设计的角度来看,他们的选择是有意义的 -std::prev接受std::next一个迭代器并返回一个分别指向上一个或下一个元素的不同迭代器,而不修改 input。
std::advance另一方面修改输入。如果它返回对输入迭代器的引用,则可能会与返回副本而不就地修改输入的函数混淆。这可能有潜在的危险。
请注意,std::advance与InputIterators 一起使用,其中包括迭代器,其中迭代具有副作用(例如从流读取的迭代器),但std::prev和std::next只与 s 一起使用ForwardIterator,而 s 没有副作用。
因此,返回一个单独的值(例如std::prev和std::next)将是一个坏主意 - 您最终会在同一个流上得到两个迭代器,这可能会对彼此产生不利影响。