в (std :: cin): что это значит? - PullRequest
       36

в (std :: cin): что это значит?

3 голосов
/ 25 ноября 2011

В первом примере Boost используется in(std::cin). Я думаю in() получить istream и создать какой-то итератор. Однако я не смог найти никакой документации C ++, которая объясняет это подробно. Не могли бы вы помочь мне найти один?

вот копия и вставка примера с веб-страницы Boost:

#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
   using namespace boost::lambda;
   typedef std::istream_iterator<int> in;
   std::for_each(
   in(std::cin), in(), std::cout << (_1 * 3) << " " );
}

Ответы [ 3 ]

9 голосов
/ 25 ноября 2011

in - это просто typedef для std::istream_iterator<int>, поэтому в примере просто вызывается std::for_each в «диапазоне», определенном двумя временными итераторами: std::istream_iterator<int>(std::cin) и std::istream_iterator<int>().

Значение, инициируемое istream_iterator - это просто универсальный итератор конца для потоков.

Принцип работы std::cout << (_1 * 3) << " " более тонкий.Поскольку _1 происходит из пространства имен boost::lambda, оно гарантирует, что используются операторы * и затем << из пространства имен boost::lambda, а не operator<<, который действует непосредственно на std::ostream.Таким образом, все выражение становится лямбда , а не (любая его часть) выполняется как обычное выражение на сайте вызовов for_each.

4 голосов
/ 25 ноября 2011

Вы определили это здесь:

typedef std::istream_iterator<int> in;

Таким образом, in(std::cin) - это итератор целых чисел, используемый std::for_each, который читает из stdin (cin) и умножает их на3 и распечатывает их.

1 голос
/ 25 ноября 2011

Обратите внимание на typedef в коде:

typedef std::istream_iterator<int> in;

Таким образом, in(...) совпадает с std::istream_iterator<int>(...): он вызывает конструктор для этого типа. Существует конструктор с 1 аргументом, который принимает std::istream, создавая итератор, который представляет текущую точку в этом потоке; и конструктор с 0 аргументами, создающий итератор, который представляет конец любого данного потока. Таким образом, std::for_each будет перебирать каждое значение, предоставленное std::cin с этого момента, пока не закончится.

std::istream_iterator<int> принимает поток и предоставляет итератор для int s в потоке, используя operator>> для чтения их из потока.

Однако я не смог найти никакой документации по C ++, которая бы объясняла это подробно.

Я не знаю, как ты мог потерпеть неудачу. Я добавил std::istream_iterator<int> в Google, и первый результат был http://www.sgi.com/tech/stl/istream_iterator.html, что довольно основательно, если вы уже знакомы с итераторами. Следующий результат - http://www.cplusplus.com/reference/std/iterator/istream_iterator/, который делает еще одну попытку объяснить вещи, а также полностью детализирован. Затем следует http://stdcxx.apache.org/doc/stdlibref/istream-iterator.html, аналогично, который в конечном итоге явно упоминает operator>> вместо того, чтобы просто говорить о форматированных операциях ввода / вывода (что и делает operator>>). Далее идет страница с некоторыми примерами фрагментов C ++, затем пара вопросов StackOverflow, где люди пытались сделать что-то подобное и т. Д. ...

...