c++ - 为什么 std::advance 不返回结果迭代器?

标签 c++ iterator c++-standard-library

目前,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::nextstd::prev 会返回结果迭代器。

最佳答案

没有技术原因阻止它返回对输入值的引用,如果不使用返回值,任何合理的编译器都应该能够优化它。因此,如果他们愿意,他们可以那样做。

我认为他们的选择从 API 设计的角度来看是有意义的 - std::prevstd::next 接受一个迭代器并返回一个不同的迭代器指向分别指向上一个或下一个元素,无需修改输入

std::advance 另一方面修改输入。如果它返回对输入迭代器的引用,它可能会混淆一个返回拷贝而不修改输入的函数。这可能是危险的。

请注意 std::advanceInputIterator 一起工作,其中包括迭代器,其中迭代器具有副作用(例如从流中读取的迭代器),但是 std::prevstd::next 仅适用于 ForwardIterator,它们没有副作用。

因此返回一个单独的(如std::prevstd::next)将不是一个好主意——你会最终在同一个流上有两个迭代器,这可能会相互影响。

关于c++ - 为什么 std::advance 不返回结果迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30966040/

相关文章:

c++ - 我应该从哪里获得其他人用来构建 boost 的 b2.exe 和 bjam.exe?

带有模板参数的函数的 C++ 函数包装器

iterator - 如何将正在迭代的迭代器传递给函数?

c++ - 从文件读取到 char 数组的首选方法是什么?

c++ - 使用构造函数初始化您的类,该构造函数将 std::map 作为带有大括号括起来的初始化程序的参数

c++ - 使用opencv将RGB图像转换为一维数组

c++ - 将一个字节放在硬盘上一个非常特定的地址,可以做到吗? (例如使用 C++)

java - 为什么 `weakly consistent iterator`只反射(reflect)修改和删除变化,而不反射(reflect)插入变化

用于创建斐波那契数列生成器的 Python 脚本

c++ - 标准实验锁存器和屏障使用 ptrdiff_t