я читаю Стандарт C ++ (Раздел Input Iterator), и мне трудно представить текст жирным шрифтом:
Примечание. Для входных итераторов a == b не означает ++ a == ++ b. (Равенство не гарантирует замены
свойство или ссылочная прозрачность.) Алгоритмы на входных итераторах никогда не должны пытаться пройти
через один и тот же итератор дважды. Это должны быть однопроходные алгоритмы.
Я понимаю, что входные итераторы являются однопроходными, но я не могу представить их в коде C ++. Может кто-нибудь показать мне пример того, как сделать итератор одним проходом?
Предположим, вы хотите прочитать целые числа из стандартного ввода. Один из способов сделать это будет использовать
#include <iterator>
#include <iostream>
#include <vector>
using namespace std;
const vector<int> v{istream_iterator<int>{cin}, istream_iterator<int>{}};
Это будет читать целые числа в v
(увидеть istream_iterator
).
В этом случае имеет большой смысл, что итераторы будут однопроходными, поскольку диапазон — это то, что просто создается на лету, когда пользователь вводит вещи, а каждый элемент расходуется и исчезает. Вы не можете повторить этот диапазон.
Кроме этого, не уверен, что вы подразумеваете под
Как сделать итератор, чтобы стать одним проходом?
Если вы имеете в виду «как показать, что класс итератора, который вы пишете, имеет это ограничение?», То установите его iterator_category
в input_iterator_tag
struct my_iterator
{
using iterator_category = input_iterator_tag;
};
Если вы хотите запросить (во время компиляции), имеет ли класс итератор это ограничение, используйте iterator_traits
.
Других решений пока нет …