расстояние делает мой итератор "заморозить" - PullRequest
4 голосов
/ 08 июня 2011

Попробуйте это:

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 Ответ

15 голосов
/ 08 июня 2011

distance на входном итераторе будет повторно вызывать operator++.Однако эта операция делает недействительными все копии итератора, поскольку все они ссылаются на один и тот же базовый поток

Это логично: рассмотрим, что представляет итератор: текущее состояние входного потока.Как только вы добавите итератор, это состояние изменится.Поэтому все другие итераторы, представляющие старое состояние, теперь ссылаются на состояние, которого больше нет.

Вот почему вы видите это поведение.

Более того, получение расстояния от двух потоковых операторов не являетсязначимая операция, поскольку потоки не имеют фиксированной длины : потоки представляют переходное состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...