Если вам нужно поддерживать состояние итератора, не используйте итератор !Итераторы предназначены для случаев, когда вы можете уничтожить свое состояние по ходу.
Вы могли бы быть в состоянии обойтись без использования потока.Потоки имеют привычку не оставлять свою память, когда это необходимо, потому что ссылки сохраняются там, где вы их не хотите (но где вы можете сказать, что они существуют, если вы об этом думаете).Так что, если вы начали с итератора, вы можете .toStream его и передать подпотоки, а затем передать поток для дальнейшей обработки.Но вы должны быть очень осторожны, чтобы не сохранить ссылку на начало потока, если хотите избежать хранения всего в памяти.
Другой способ - просто сбросить все данные в вектор или массиви сохранить всю проблему в памяти;затем вы можете отбросить нерелевантные части (или продвинуть индекс) по ходу работы.
Наконец, если вы абсолютно уверены , что вам не нужно возвращаться назад, тогда вы можете простоиспользуйте итератор как есть, не беспокоясь о «поддержании состояния».То есть, когда вы вернетесь из под-метода, вы уже будете использовать точно правильные токены и не более, и сможете продолжать анализировать.Чтобы это работало без хотя бы одного элемента «следующий токен, который я не использовал» для возвращаемого значения, необходимо иметь возможность предсказать, где находится последний токен (например, список неограниченной длины должен заканчиваться натокен, который был частью списка, поэтому {1,2,3}
может быть списком (если вы переходите к обработке списка, когда видите {
, и выпадаете, когда нажимаете }
), но не 1,2,3 + 7
(потому что вы 'потреблю +
до того, как вы поймете, что список окончен)).