您的位置:首页 > 产品设计 > UI/UE

Build a Simple Program Using Boost in(std::cin) : What does it mean?

2013-01-31 12:40 686 查看
From:http://stackoverflow.com/questions/8262994/instdcin-what-does-it-mean

In the first example of Boost,
in(std::cin)
is
used. I think
in()
get
an
istream
and
create some kind of iterator. However, I could not find any C++ documentation that explain it in detail. Could you please help me to find one?

here is the copy and paste of the example from the Boost webpage:

#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) << " " );
}


otice the typedef in the code:
typedef std::istream_iterator<int> in;


Thus,
in(...)
is
the same as
std::istream_iterator<int>(...)
:
it's calling the constructor for that type. There is a 1-argument constructor which accepts a
std::istream
,
creating an iterator that represents the current point in that stream; and a 0-argument constructor creating an iterator that represents the end of any given stream. So
std::for_each
will
iterate over every value provided by
std::cin
from
now until it runs out.

std::istream_iterator<int>
takes
a stream and provides an iterator over the
int
s
in the stream, using
operator>>
to
read them out of the stream.

However, I could not find any C++ documentation that explain it in detail.

I don't know how you could possibly fail. I put
std::istream_iterator<int>
into
Google and the first result was http://www.sgi.com/tech/stl/istream_iterator.html which
is pretty thorough, assuming you're already familiar with iterators. The next result ishttp://www.cplusplus.com/reference/std/iterator/istream_iterator/ which
makes another attempt to explain things and is also fully detailed. Next comes http://stdcxx.apache.org/doc/stdlibref/istream-iterator.html ,
similarly, which finally explicitly mentions
operator>>
instead
of just talking about formatted I/O operations (which is what
operator>>
does).
Next comes a page with some C++ example snippets, then a couple of StackOverflow questions where people were trying to do something similar, etc....

in
is
just a
typedef
for
std::istream_iterator<int>
so
the example is just calling
std::for_each
on
a "range" defined by the two temporary iterators:
std::istream_iterator<int>(std::cin)
and
std::istream_iterator<int>()
.

A value-inititalized
istream_iterator
is
just a universal "end" iterator for streams.

How
std::cout
<< (_1 * 3) << " "
works is more subtle. Because
_1
comes
from the
boost::lambda
namespace,
it ensures that the operators
*
and
then
<<
from
the
boost::lambda
namespace
are used, rather than an
operator<<
that
acts directly on a
std::ostream
.
This way the whole expression becomes a lambda rather than (any part of it) being executed as a conventional expression at the call site of
for_each
.
typedef std::istream_iterator<int> in;


Thus
in(std::cin)
is
an iterator over integers, used by
std::for_each
,
that reads from stdin (cin) and multiplies them by 3 and prints them out.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: