Re: cout formatting + copy algorithm
On Sep 24, 3:45 pm, suresh <suresh.amritap...@gmail.com> wrote:
Hi
I display a vector using copy algorithm like this.
copy(v.begin(),v.end(),ostream_iterator<int>(cout," ");
suppose i want to set the width or the fill character, what can i do?
Of course I can use a for loop instead of copy algorithm but my
question is, while using copy algorithm, is it possible to format
output?
thanks
suresh
I believe fill character set by basic_ios::fill() should stick with
stream;
only width value set with ios_base::width doesn't 'stick' to stream
except next insertion/extraction because implementations are calling
stream.width(0) after certain I/O operations.
so you need to set width value somehow every time std::copy increments
the proxy output iterator.
you can do this every time locally with a lambda function or just
write a custom stream functor like V suggested:
/*
* ostream_it_custom_manip.cpp
*
* Created on: Sep 24, 2010
* Author: Gil
*/
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <iterator>
#include <string>
#include <vector>
#include <algorithm>
#include <boost/function_output_iterator.hpp>
template< class streamable >
struct custom_stream {
std::ostream & s_;
std::string sep_;
std::streamsize width_;
custom_stream( std::ostream & s, std::string const & sep,
int width = 0, char fill = ' ' )
: s_( s ), sep_( sep ), width_( width ) {
s_ << std::setfill( fill );
}
void operator ()( streamable const & a ) const {
s_ << std::setw( width_ ) << a << sep_;
}
};//custom_stream
int main( ) {
std::vector< int > v;
std::generate_n( std::back_inserter( v ), 10, std::rand );
std::copy( v.begin( ),
v.end( ),
boost::make_function_output_iterator(
custom_stream< int >( std::cout, "\n", 10, 'x' )
)
);
std::cout << std::endl;
return 0;
}