C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Output iterator

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++)
View previous topic :: View next topic  
Author Message
Anders
Guest





PostPosted: Sun Jun 29, 2003 10:00 pm    Post subject: Output iterator Reply with quote



Hello there.

Can anyone tell me why the ++-operator is defined for ostream_iterator ? I
can't see the difference between:

ostream_iterator<int> test(cout);
test++ = 1;
test++ = 2;
test++ = 3;
test++ = 4;

and:

ostream_iterator<int> test(cout);
test = 1;
test = 2;
test = 3;
test = 4;

//Anders


Back to top
Anders
Guest





PostPosted: Sun Jun 29, 2003 10:06 pm    Post subject: Re: Output iterator Reply with quote



And yes, I know that I should be using preincrement instead - it's faster:
---
test = 1;
++test = 2;
++test = 3;
++test = 4;
---


//Anders


Back to top
Howard Hinnant
Guest





PostPosted: Sun Jun 29, 2003 10:19 pm    Post subject: Re: Output iterator Reply with quote



In article <3eff61ac$0$32546$edfadb0f (AT) dread16 (DOT) news.tele.dk>, Anders
<gregersen (AT) adslhome (DOT) dk> wrote:

Quote:
Hello there.

Can anyone tell me why the ++-operator is defined for ostream_iterator ? I
can't see the difference between:

ostream_iterator<int> test(cout);
test++ = 1;
test++ = 2;
test++ = 3;
test++ = 4;

and:

ostream_iterator<int> test(cout);
test = 1;
test = 2;
test = 3;
test = 4;

It is so that generic code will work with ostream_iterator. For
example:

template <class InputIterator, class OutputIterator>
OutputIterator
copy(InputIterator first, InputIterator last, OutputIterator result)
{
for (; first != last; ++first, ++result)
*result = *first;
return result;
}

If you put an ostream_iterator into copy as the OutputIterator, you
really do want it to compile and "do the right thing", which in this
case is nothing for operator++().

--
Howard Hinnant
Metrowerks

Back to top
Rolf Magnus
Guest





PostPosted: Sun Jun 29, 2003 10:38 pm    Post subject: Re: Output iterator Reply with quote

Howard Hinnant wrote:

Quote:
In article <3eff61ac$0$32546$edfadb0f (AT) dread16 (DOT) news.tele.dk>, Anders
[email]gregersen (AT) adslhome (DOT) dk[/email]> wrote:

| Hello there.
|
| Can anyone tell me why the ++-operator is defined for
| ostream_iterator ? I can't see the difference between:
|
| ostream_iterator<int> test(cout);
| test++ = 1;
| test++ = 2;
| test++ = 3;
| test++ = 4;
|
| and:
|
| ostream_iterator<int> test(cout);
| test = 1;
| test = 2;
| test = 3;
| test = 4;

It is so that generic code will work with ostream_iterator. For
example:

template OutputIterator
copy(InputIterator first, InputIterator last, OutputIterator result)
{
for (; first != last; ++first, ++result)
*result = *first;
return result;
}

If you put an ostream_iterator into copy as the OutputIterator, you
really do want it to compile and "do the right thing", which in this
case is nothing for operator++().

Actually, you must use operator++ to increment the iterator for each
read/write operation, since the implementation might choose to actually
rely on this.


Back to top
Rolf Magnus
Guest





PostPosted: Sun Jun 29, 2003 11:54 pm    Post subject: Re: Output iterator Reply with quote

Howard Hinnant wrote:

Quote:
In article <bdnq3o$unr$01$1 (AT) news (DOT) t-online.com>, Rolf Magnus
[email]ramagnus (AT) t-online (DOT) de[/email]> wrote:

| Howard Hinnant wrote:
|
| > If you put an ostream_iterator into copy as the OutputIterator,
| > you really do want it to compile and "do the right thing", which
| > in this case is nothing for operator++().
|
| Actually, you must use operator++ to increment the iterator for each
| read/write operation, since the implementation might choose to
| actually rely on this.

nod> It might. But the C++ standard says in section 24.5.2.2 -
ostream_iterator operations, paragraph 3:

| ostream_iterator& operator++();
| ostream_iterator& operatot++(int);
|
| -3- Returns: *this

(i.e. do nothing)

Does that mean the same as if it specifically said that the operator
does nothing?

Quote:
I certainly would never write code that used ostream_iterator in an
unconventional manner that took advantage of this detail. And I'm not
suggesting anybody should. But if you want to get picky,
ostream_iterator::operator++() is defined by the C++ standard to do
nothing but return *this.

I didn't read in the standard, but in TC++PL3, which says:

"The ++ operation might trigger an actual output operation, or it might
have no effect. Different implementations will use different
implementation strategies. Consequently, for code to be portable, a ++
must occur between every two assignments to an ostream_iterator."

Quote:
And the main reason that ostream_iterator
has all of these "extra" operations that do nothing is so that it can
be used seamlessly as any other iterator that supports the semantics
required by output_iterator_tag (i.e. output, forward, bidirectional
and random access iterators).

Ack.


Back to top
Howard Hinnant
Guest





PostPosted: Mon Jun 30, 2003 12:52 am    Post subject: Re: Output iterator Reply with quote

In article <bdnuim$20g$01$1 (AT) news (DOT) t-online.com>, Rolf Magnus
<ramagnus (AT) t-online (DOT) de> wrote:

Quote:
Howard Hinnant wrote:

nod> It might. But the C++ standard says in section 24.5.2.2 -
ostream_iterator operations, paragraph 3:

| ostream_iterator& operator++();
| ostream_iterator& operatot++(int);
|
| -3- Returns: *this

(i.e. do nothing)

Does that mean the same as if it specifically said that the operator
does nothing?

Hmm... no, I think you're right. It could have other effects, though
I'm having trouble coming up with a quick realistic example. Maybe
some kind of debugging info?

Quote:
I certainly would never write code that used ostream_iterator in an
unconventional manner that took advantage of this detail. And I'm not
suggesting anybody should. But if you want to get picky,
ostream_iterator::operator++() is defined by the C++ standard to do
nothing but return *this.

I didn't read in the standard, but in TC++PL3, which says:

"The ++ operation might trigger an actual output operation, or it might
have no effect. Different implementations will use different
implementation strategies. Consequently, for code to be portable, a ++
must occur between every two assignments to an ostream_iterator."

Well, the standard explicitly says that the output will occur under
op=(const T&) operator:

Quote:
ostream_iterator& operator=(const T& value );

-1- Effects:
*out_stream << value;
if(delim != 0) * out_stream << delim;
return (*this);

So I don't see how the op++ could also trigger output without really
messing things up.

Quote:
Ack.

Bill? Bill The Cat? Is that you?!! We've missed you soooo much! :-)

--
Howard Hinnant
Metrowerks

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.