距离让我的迭代器"冻结"

sma*_*llB 4 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;
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 15

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

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

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

此外,从两个流运营商获得距离并不是一个有意义的操作,因为流没有固定长度:流表示瞬态.

  • @smallB你无法概括这种情况.例如,`/ dev/random`是一个没有结束*的文件*.或者考虑本地计算机不知道资源大小的网络流,或者当前正在写入的日志文件.通常,不可能确定文件流的长度.有特殊情况(例如你的),但流迭代器接口迎合一般情况,而不是特殊情况.还有其他方法可以确定固定文件的长度,但不能通过迭代器来确定. (3认同)