2016-02-06 3 views
2

Я читаю C++ Standard (раздел Input итератора) и у меня трудное время, чтобы визуализировать текст выделен жирным шрифтом:C++ Ввод Итератор

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

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

+0

Что вы подразумеваете под «как сделать итератор, чтобы стать одним проходом»? Почему они проходят один проход? Или как работать с такими итераторами? –

+0

Я не уверен, что вы спрашиваете. Итераторы - это то, чем они являются; они не «становятся» ничем. Вы просите пример итератора, который не является многопроходным? Если да, рассмотрим тот, который читает из 'stdin' –

+0

@Revolver_Ocelot Извините за то, что он не ясен, я хочу создать итератор ввода с нуля (не используя STL или boost) для обучения. Я просто не знаю, как сделать мой класс итератора ввода одним проходом (силовой проход)? В моем понимании это работа основного контейнера или потока ('stdin'), чтобы сделать итератор в качестве входного или пересылаемого итератора, правильно? – Orion

ответ

2

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

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

+0

Итераторы вперёд - многопроходные, вы имели в виду 'input_iterator_tag'? –

+0

@ M.M Один из многочисленных моментов, когда мне нужно поблагодарить вас за полезный комментарий. Большое спасибо! –

+0

@AmiTavory Извините за то, что я не понимаю, я хочу создать итератор ввода с нуля (не используя STL или boost) для обучения. Я просто не знаю, как сделать мой класс итератора ввода одним проходом (силовой проход)? В моем понимании это работа основного контейнера или потока ('stdin'), чтобы сделать итератор в качестве входного или пересылаемого итератора, правильно? – Orion

Смежные вопросы