#include #include #include #include #include #include class Repeater { public: class iterator; Repeater(std::vector& c, int count) : c{c}, count{count} { } iterator begin() { return iterator{c.begin(), c.begin(), c.end(), count, 0}; } iterator end() { return iterator{c.begin(), c.end(), c.end(), count, count}; } private: std::vector& c; int count; public: class iterator { using It = std::vector::iterator; public: iterator(It begin, It cur, It end, int max_count, int count) : begin{begin}, cur{cur}, end{end}, max_count{max_count}, count{count} { } iterator& operator++() { ++cur; if (cur == end && count + 1 < max_count) { cur = begin; ++count; } return *this; } int operator*() { return *cur; } bool operator==(iterator const& other) const { return cur == other.cur; } bool operator!=(iterator const& other) const { return !(*this == other); } private: It begin; It cur; It end; int max_count; int count; }; }; Repeater repeater(std::vector& c, int count = 2) { return Repeater{c, count}; } int main() { { std::vector v { 1, 2, 3 }; for (int i : repeater(v, 2)) { std::cout << i << " "; } std::cout << std::endl; } // { // std::list l { 4.5, 6.78, 9.0 }; // for (double d : repeater(l, 3)) // { // std::cout << d << " "; // } // std::cout << std::endl; // } /* För VG */ // { // std::vector v { "hello", " ", "world", "\n" }; // auto r = repeater(v, 4); // std::copy(r.begin(), r.end(), std::ostream_iterator{std::cout, ""}); // } // { // std::vector v { 1, 2, 3 }; // auto r = repeater(v, 10); // std::transform(r.begin(), r.end(), r.begin(), [](int i) { return i + 1; }); // // print 'v' (not 'r') // std::copy(v.begin(), v.end(), std::ostream_iterator{std::cout, " "}); // std::cout << std::endl; // } // { // std::vector v { 1, 2, 3 }; // auto r = repeater(v, 2); // auto it = r.begin(); // std::cout << *it++ << " "; // std::cout << *it << " "; // std::cout << *++it << std::endl; // } }