#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
template <class T,
class charT = char,
class traits = std::char_traits<charT> >
class my_infix_ostream_iterator :
public std::iterator<std::output_iterator_tag, void, void, void, void>
{
std::basic_ostream<charT, traits> *os;
charT const* delimiter;
size_t counter, numPerLine;
public:
typedef charT char_type;
typedef traits traits_type;
typedef std::basic_ostream<charT,traits> ostream_type;
my_infix_ostream_iterator(ostream_type& s, size_t numPerLine = 0, charT const *d = 0)
: os(&s), delimiter(d), numPerLine(numPerLine), counter(0)
{}
my_infix_ostream_iterator& operator=(T const &item)
{
if (counter > 0)
{
if (delimiter)
*os << delimiter;
if ((numPerLine > 0) && ((counter % numPerLine) == 0))
*os << os->widen('\n');
}
*os << item;
++counter;
return *this;
}
my_infix_ostream_iterator& operator*() {
return *this;
}
my_infix_ostream_iterator& operator++() {
return *this;
}
my_infix_ostream_iterator& operator++(int) {
return *this;
}
};
struct myClass
{
int value;
};
std::ostream& operator<<(std::ostream &os, const myClass &cls)
{
os << cls.value;
return os;
}
int main()
{
std::vector<myClass> myVec = {
{1}, {2}, {3}, {4}, {5},
{6}, {7}, {8}, {9}, {10},
{11}, {12}, {13}
};
std::cout << "Using a for loop..." << std::endl;
my_infix_ostream_iterator<myClass> iter(std::cout, 5, ", ");
for (const auto &elem : myVec) {
*iter++ = elem;
}
std::cout << std::endl << std::endl;
std::cout << "Using std::copy()..." << std::endl;
std::copy(myVec.begin(), myVec.end(),
my_infix_ostream_iterator<myClass>(std::cout, 5, ", ")
);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAKI2luY2x1ZGUgPGl0ZXJhdG9yPiAKI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnRlbXBsYXRlIDxjbGFzcyBULCAKICAgICAgICAgIGNsYXNzIGNoYXJUID0gY2hhciwgCiAgICAgICAgICBjbGFzcyB0cmFpdHMgPSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXJUPiA+IApjbGFzcyBteV9pbmZpeF9vc3RyZWFtX2l0ZXJhdG9yIDogCiAgICBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+IAp7IAogICAgc3RkOjpiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+ICpvczsKICAgIGNoYXJUIGNvbnN0KiBkZWxpbWl0ZXI7CiAgICBzaXplX3QgY291bnRlciwgbnVtUGVyTGluZTsgCgpwdWJsaWM6IAogICAgdHlwZWRlZiBjaGFyVCBjaGFyX3R5cGU7IAogICAgdHlwZWRlZiB0cmFpdHMgdHJhaXRzX3R5cGU7IAogICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08Y2hhclQsdHJhaXRzPiBvc3RyZWFtX3R5cGU7IAoKICAgIG15X2luZml4X29zdHJlYW1faXRlcmF0b3Iob3N0cmVhbV90eXBlJiBzLCBzaXplX3QgbnVtUGVyTGluZSA9IDAsIGNoYXJUIGNvbnN0ICpkID0gMCkKICAgICAgICA6IG9zKCZzKSwgZGVsaW1pdGVyKGQpLCBudW1QZXJMaW5lKG51bVBlckxpbmUpLCBjb3VudGVyKDApIAogICAge30gCgogICAgbXlfaW5maXhfb3N0cmVhbV9pdGVyYXRvciYgb3BlcmF0b3I9KFQgY29uc3QgJml0ZW0pCiAgICB7IAogICAgICAgIGlmIChjb3VudGVyID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkZWxpbWl0ZXIpCiAgICAgICAgICAgICAgICAqb3MgPDwgZGVsaW1pdGVyOyAKICAgICAgICAgICAgaWYgKChudW1QZXJMaW5lID4gMCkgJiYgKChjb3VudGVyICUgbnVtUGVyTGluZSkgPT0gMCkpCiAgICAgICAgICAgICAgICAqb3MgPDwgb3MtPndpZGVuKCdcbicpOwogICAgICAgIH0KICAgICAgICAqb3MgPDwgaXRlbTsKICAgICAgICArK2NvdW50ZXI7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIG15X2luZml4X29zdHJlYW1faXRlcmF0b3ImIG9wZXJhdG9yKigpIHsgCiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIG15X2luZml4X29zdHJlYW1faXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIG15X2luZml4X29zdHJlYW1faXRlcmF0b3ImIG9wZXJhdG9yKysoaW50KSB7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQp9OyAgICAgCgpzdHJ1Y3QgbXlDbGFzcwp7CglpbnQgdmFsdWU7Cn07CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgbXlDbGFzcyAmY2xzKQp7CglvcyA8PCBjbHMudmFsdWU7CglyZXR1cm4gb3M7Cn0KCmludCBtYWluKCkKewoJc3RkOjp2ZWN0b3I8bXlDbGFzcz4gbXlWZWMgPSB7CgkJezF9LCB7Mn0sIHszfSwgezR9LCB7NX0sCgkJezZ9LCB7N30sIHs4fSwgezl9LCB7MTB9LAoJCXsxMX0sIHsxMn0sIHsxM30KCX07CgoJc3RkOjpjb3V0IDw8ICJVc2luZyBhIGZvciBsb29wLi4uIiA8PCBzdGQ6OmVuZGw7CgkKCW15X2luZml4X29zdHJlYW1faXRlcmF0b3I8bXlDbGFzcz4gaXRlcihzdGQ6OmNvdXQsIDUsICIsICIpOwoJZm9yIChjb25zdCBhdXRvICZlbGVtIDogbXlWZWMpIHsKCSAgICAqaXRlcisrID0gZWxlbTsKCX0KCglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKCQoJc3RkOjpjb3V0IDw8ICJVc2luZyBzdGQ6OmNvcHkoKS4uLiIgPDwgc3RkOjplbmRsOwoKCXN0ZDo6Y29weShteVZlYy5iZWdpbigpLCBteVZlYy5lbmQoKSwKCSAgICBteV9pbmZpeF9vc3RyZWFtX2l0ZXJhdG9yPG15Q2xhc3M+KHN0ZDo6Y291dCwgNSwgIiwgIikKCSk7CgoJcmV0dXJuIDA7Cn0=
Using a for loop...
1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
11, 12, 13
Using std::copy()...
1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
11, 12, 13