Ввод против итератора вывода - соглашения об именах - PullRequest
1 голос
/ 04 сентября 2011

Я просто пытаюсь понять, что на самом деле представляют собой InputIterator и OutputIterator в C ++. Теперь, до сих пор, я всегда предполагал, что определения, которые я всегда знал о Input и Output , также применяются к итераторам.

Таким образом, это означает, что Ввод означает «поместить во что-то», что означает, что вы можете написать в итератор, например, вставить что-то в итератор.

Вывод - это «где-то потушить», и это всегда значило для меня, писать на экран или вставлять в переменную.

Теперь выясняется, что с нашими друзьями-итераторами, наоборот, InputIterator используется для доступа только для чтения к последовательности элементов, которая, по-видимому, должна называться «Выход». , поскольку вы используете этот тип итератора, например, для записи элементов от std::vector<int> до std::cout.

OutputIterator оказывается тем, который имеет доступ только для записи.

Я задавался вопросом, может ли кто-нибудь дать разумное объяснение этому, я считаю довольно странным называть типы итераторов?

Ответы [ 2 ]

8 голосов
/ 04 сентября 2011

Это просто вопрос соглашения.«Вход» и «вывод» понимаются как «от» / «до» по отношению к среде, а не по отношению к вашей программе;или в другом направлении, как «в / из» по отношению к вашей программе, а не к среде.

Таким образом, «вход» получает что-то из среды и делает ее доступной для вашейпрограмма, например istream или read.«Вывод» помещает что-то из вашей программы обратно в среду, например ostream и write.

Итераторы следуют в том же направлении, входной итератор делает данные из диапазона доступными для вашей программы,в то время как выходной итератор помещает данные из вашей программы в диапазон.


Вы можете думать, что «input» - это чужой ввод, который ваша программа должна захотеть записатьк.Но я предполагаю, что формулировка предполагает эгоцентрического программиста, для которого их собственная точка отсчета является точкой отсчета, а не кто-либо (или каждый) в среде.

4 голосов
/ 04 сентября 2011

Итератор ввода - это оболочка входного потока. Выходной итератор является оберткой вокруг выходного потока.

(Правда, вы можете написать другие итераторы ввода / вывода, но это примеры, которые существуют в стандарте в форме istream_iterator и ostream_iterator)

Поток ввода - это тот, из которого вы читаете (вы получаете ввод), и, таким образом, итератор ввода - это тот, из которого вы также можете получать ввод.

Я согласен, это может быть несколько не интуитивно понятно, если вы просто считаете их итераторами. Но когда вы помните, что они обычно обертывают поток, это имеет больше смысла.

Например, вы можете создать ostream_iterator (который является OutputIterator) около std::cout.

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