#include <vector>
#include <list>
#include <iostream>

using namespace std;

vector<vector<int>> split(const vector<int>& v, size_t n)
{
    vector<vector<int>> r;
    for(size_t i = 0, S = v.size(), m = (S+n-1)/n; i < m; ++i)
        r.emplace_back(v.begin()+i*n,v.begin()+i*n+(i==m-1&&S%n?S%n:n));
    return r;
}

template<typename Iterator>
vector<vector<typename Iterator::value_type>>
    split(Iterator b, Iterator e, size_t n)
{
    vector<vector<typename Iterator::value_type>> r;
    while(b != e)
    {
        Iterator start = b;
        size_t m = n;
        while(m-- && b != e) b = next(b);
        r.emplace_back(start,b);
    }
    return r;
}


int main(int argc, char * argv[])
{
    for(auto a: split({1,2,3,4,5,6,7,8,9,10},3))
    {
        for(auto b: a) cout << b << "  ";
        cout << "\n";
    }
    list<int> L = {1,2,3,4,5,6,7,8,9,10};
    for(auto a: split(L.begin(),L.end(),3))
    {
        for(auto b: a) cout << b << "  ";
        cout << "\n";
    }
}
