C ++ Input Iterator

я читаю Стандарт C ++ (Раздел Input Iterator), и мне трудно представить текст жирным шрифтом:

Примечание. Для входных итераторов a == b не означает ++ a == ++ b. (Равенство не гарантирует замены
свойство или ссылочная прозрачность.) Алгоритмы на входных итераторах никогда не должны пытаться пройти
через один и тот же итератор дважды. Это должны быть однопроходные алгоритмы.

Я понимаю, что входные итераторы являются однопроходными, но я не могу представить их в коде C ++. Может кто-нибудь показать мне пример того, как сделать итератор одним проходом?

1

Решение

Предположим, вы хотите прочитать целые числа из стандартного ввода. Один из способов сделать это будет использовать

#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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]