 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Anders Guest
|
Posted: Sun Jun 29, 2003 10:00 pm Post subject: Output iterator |
|
|
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
|
Posted: Sun Jun 29, 2003 10:06 pm Post subject: Re: Output iterator |
|
|
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
|
Posted: Sun Jun 29, 2003 10:19 pm Post subject: Re: Output iterator |
|
|
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
|
Posted: Sun Jun 29, 2003 10:38 pm Post subject: Re: Output iterator |
|
|
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
|
Posted: Sun Jun 29, 2003 11:54 pm Post subject: Re: Output iterator |
|
|
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
|
Posted: Mon Jun 30, 2003 12:52 am Post subject: Re: Output iterator |
|
|
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.
Bill? Bill The Cat? Is that you?!! We've missed you soooo much! :-)
--
Howard Hinnant
Metrowerks
|
|
| Back to top |
|
 |
|
|
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
|
|