Re: Iterating and printing
On Apr 6, 2:17 pm, "mikehul...@googlemail.com"
<mikehul...@googlemail.com> wrote:
Imagine I have a class
class C
{
};
ostream& operator<<(ostream& o, const C& c) { ...}
I have a collection of these objects, in an STL list or vector and
want to do 2 things:
1/ Print all these objects to cout
2/ Write all these objects to a long string
Now, I wanted to try and use for_each and avoid my usual code of
Forget for_each. It doesn't buy you anything here. (You can
use it, but you end up writing more code than if you wrote the
loop manually.)
stringstream s;
for( collection<C>::iterator it = Collection.begin(); it !=
Collection.end(); it++)
{
cout << *it;
s << *it;}
You don't really want to output to both streams in the same
loop, do you? And doubtlessly, you'll need a separator or some
other formatting structure as well.
Typically, I'd encapsulate the container in a class of my own
anyway, and then add something like:
std::ostream&
operator<<( std::ostream& dest, ContainerC const& source )
{
dest << '[' ;
for ( ContainerC::iterator it = source.begin() ;
it != source.end() ;
++ it ) {
if ( it != source.begin() ) {
dest << ", " ;
}
dest << *it ;
}
dest << ']' ;
return dest ;
}
As you can see, there's a bit more to it than just iterating
over the values; handling the separator is particularly
bothersome; the std::ostream_iterator got it wrong, and for that
reason are practically useless.
This seems like a fairly common task!
It is, but since formatting is so specific, it tends to be
written out explicitly each time it's needed.
--
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