使用ostream_iterator取消引用和增量

时间:2018-01-03 21:35:30

标签: c++

我从http://en.cppreference.com/w/cpp/iterator/ostream_iterator/ostream_iterator找到了这段代码:

#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
    std::ostream_iterator<int> i1(std::cout, ", ");
    std::fill_n(i1, 5, -1);
    std::ostream_iterator<double> i2(std::cout);
    *i2++ = 3.14;
}

为什么需要++中的*i2++ = 3.14;

2 个答案:

答案 0 :(得分:2)

从概念上讲,在写入范围时,您希望在写入一个范围后移动到下一个元素。对于大多数迭代器,例如一个std::vector::iterator,必须明确地完成。所以包含它是有意义的,只是为了保持一致性。

std::ostream_iterator的特定情况下,它虽然没有实际效果,但可以省略。你无法覆盖&#34;元素&#34;无论如何,推进是隐式的(并且只是隐式的,即增量运算符和derefencing在这种情况下都是无操作)。

重要部分仅是operator =,如相关文档中所述:

#include <iostream>
#include <iterator>

int main()
{
    std::ostream_iterator<int> i1(std::cout, ", ");
    *i1++ = 1; // usual form, used by standard algorithms
    *++i1 = 2;
    i1 = 3; // neither * nor ++ are necessary
    std::ostream_iterator<double> i2(std::cout);
    i2 = 3.14;
}

答案 1 :(得分:1)

++运算符对std::ostream_iterator没有影响。分配给*i2会自动推进输出流。

提供它是为了ostream_iterator可以在允许普通迭代器的任何地方使用,并且大多数迭代器必须显式增加。

即使使用普通的迭代器,如果多次使用它,通常也只需要增加它。在您找到的代码段中,只使用一次,增量完全没必要。如果它在一个循环中会更合理。