#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <string>
#include <vector>

class Repeater
{
public:

    class iterator;
    
    Repeater(std::vector<int>& 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<int>& c;
    int count;

public:

    class iterator
    {
        
        using It = std::vector<int>::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<int>& c, int count = 2)
{
    return Repeater{c, count};
}

int main()
{
    {
        std::vector<int> v { 1, 2, 3 };
        for (int i : repeater(v, 2))
        {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    }

    // {
    //     std::list<double> 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<std::string> v { "hello", " ", "world", "\n" };
    //     auto r = repeater(v, 4);
    //     std::copy(r.begin(), r.end(), std::ostream_iterator<std::string>{std::cout, ""});
    // }

    // {
    //     std::vector<int> 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<int>{std::cout, " "});
    //     std::cout << std::endl;
    // }

    // {
    //     std::vector<int> v { 1, 2, 3 };
    //     auto r = repeater(v, 2);
    //     auto it = r.begin();
    //     std::cout << *it++ << " ";
    //     std::cout << *it << " ";
    //     std::cout << *++it << std::endl;
    // }
}