Re: input and forward iterator difference
On Jun 3, 6:44 pm, Michal <rabbi...@tenbit.pl> wrote:
Hallo group members
I wonder what is the difference between the two.
I can read that:
Input iterators are iterators especially designed for
sequential input operations, where each value pointed by
the iterator is read only once and then the iterator is
incremented.
I also can read:
A Forward Iterator is an iterator that corresponds to the
usual intuitive notion of a linear sequence of values. It
is possible to use Forward Iterators (unlike Input
Iterators and Output Iterators) in multipass algorithms.
So my idea is that maybe dereferencing input iterator makes it
automatically move one step forward, while the same action on
forward iterator does not move it.
No. The difference is that incrementing a forward iterator has
no effect on any copies of it. Incrementing an input iterator
may. Thus, a == b implies ++ a == ++ b for a forward iterator,
but not for an input iterator.
Unfortunatelly this is not true:
#include <fstream>
#include <iterator>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
ifstream f("/tmp/m.txt");
istream_iterator<int> a(f);
cout << *a << *a << *a;
cout << *a << *a << *a;
++a;
return 0 ;
}
Try the following:
std::istringstream f( " 1 2 3 4 5 6 7 8 9" ) ;
std::istream_iterator< int > a( f ) ;
std::istream_iterator< int > b( a ) ;
std::cout << *a << std::endl ; ++ a ;
std::cout << *a << std::endl ; ++ a ;
std::cout << *a << std::endl ; ++ a ;
std::cout << *b << std::endl ; ++ b ;
std::cout << *b << std::endl ; ++ b ;
If istream_iterator were a forward iterator, the results would
be guaranteed to be 1 2 3 1 2. It's not, however, and they
won't be. (Try constructing b directly from f, as well, instead
of copy constructing it. The results will be rather surprising
as well.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34