距离让我的迭代器“冻结”

时间:2011-06-08 10:27:34

标签: c++ iterator

试试这个:

int main()
{
    std::fstream fin_fout("some.txt");
    std::istream_iterator<std::string> beg(fin_fout),end;
    std::distance(beg,end);//if this line is commented out it works fine but not if is uncommented
    while (beg != end)
    {
      cout << *beg;
      ++beg;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:15)

输入迭代器上的

distance将重复调用operator++。但是,此操作使迭代器的所有副本无效,因为它们都引用相同的基础流

这是合乎逻辑的:考虑迭代器表示的内容:输入流的当前状态。一旦你推进迭代器,那状态就会改变。因此,表示旧状态的所有其他迭代器现在指的是不再存在的状态。

这就是你看到这种行为的原因。

与两个流运营商保持距离并不是一项有意义的操作,因为流没有固定的长度:流代表瞬态。