Re: ostream_iterator and the delimiter before the item
In article <f2d6c584-c903-4eb3-a35d-a9de5fd98728
@d2g2000pra.googlegroups.com>, sjackman@gmail.com says...
I often need to output a list with a delimiter (such as a tab or a
comma) before the item rather than after (which is where the end-of-
line will go). ostream_iterator puts the delimiter after the item. Is
there a simple solution for creating an ostream_iterator that puts the
delimiter before the item?
Fairly simple to implement, if somewhat more verbose than anybody would
like:
// Warning: only minimally tested.
// prefix_iterator.h
#include <ostream>
#include <iterator>
template <class T,
class charT=char,
class traits=std::char_traits<charT>
class prefix_ostream_iterator :
public std::iterator<std::output_iterator_tag,void,void,void,void>
{
charT const* delimiter;
std::basic_ostream<charT,traits> *os;
public:
typedef charT char_type;
typedef traits traits_type;
typedef std::basic_ostream<charT,traits> ostream_type;
prefix_ostream_iterator(ostream_type& s)
: os(&s),delimiter(0)
{}
prefix_ostream_iterator(ostream_type& s, charT const *d)
: os(&s),delimiter(d)
{}
prefix_ostream_iterator<T,charT,traits>& operator=(T const &item)
{
// Here's the only real change from ostream_iterator:
// Normally, the '*os << item;' would come before the 'if'.
if (delimiter != 0)
*os << delimiter;
*os << item;
return *this;
}
prefix_ostream_iterator<T,charT,traits> &operator*() {
return *this;
}
prefix_ostream_iterator<T,charT,traits> &operator++() {
return *this;
}
prefix_ostream_iterator<T,charT,traits> &operator++(int) {
return *this;
}
};
// Minimal test file:
#include <vector>
#include <iostream>
#include "prefix_iterator.h"
int main() {
std::vector<int> x;
x.push_back(1);
x.push_back(3);
x.push_back(5);
std::copy(x.begin(), x.end(),
prefix_ostream_iterator<int>(std::cout, "|"));
return 0;
}
The test code is pretty minimal, but more probably isn't necessary --
this is little more than a trivial modification of the code as it's
presented in the standard, and most of it is pretty basic boilerplate.
--
Later,
Jerry.
The universe is a figment of its own imagination.