【发布时间】:2013-04-23 19:04:37
【问题描述】:
根据大多数 C++ 参考资料,例如 cplusplus.com,forward iterators 不需要可分配(我的意思是,尊重左值)。但是,对于一些需要写入值的 STL 算法,例如std::fill(也有std::generate 等),规范使用了前向迭代器:
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);
而等效行为需要左值取消引用:
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
while (first != last) {
*first = val;
++first;
}
}
因此,它实际上是使用单次传递的可变前向迭代器。
现在的问题是:
(1) 为什么不明确说明在这些情况下使用的前向迭代器是可变的?
(2)更新:我发现下面的问题很愚蠢:我暂时忘记了输出迭代器不需要支持相等比较。无论如何,上述问题仍然存在。
为什么std::fill、std::generate 等使用前向迭代器而不是输出迭代器,而它们实际上并不需要多次传递? (例如,std::copy 只需要输出迭代器。原理是什么?)
【问题讨论】:
-
forward iterators are not required to be assignable,你是怎么确定的?我很确定它们是可分配的。 -
@JesseGood 出于实际目的,它们几乎总是可赋值的,但如果您阅读参考文献cplusplus.com/reference/iterator/ForwardIterator/…,则不是。
-
@JesseGood 我也在 SO 上找到了这个:stackoverflow.com/questions/14058642/…
-
感谢您的链接,我不知道这一点。该链接还链接到this SO question,我认为它可以回答您的问题。
-
@JesseGood 谢谢,读起来很有趣。在阅读了您提到的线程后,这个问题对我来说更像是标准中的缺陷。