#include #include using namespace std; template struct IteratorRange{ Iterator begin () const { return first; } Iterator end() const { return last; } size_t size(){ size_t cnt = 0; while ( first < last ){ cnt++; first++; } return cnt; } Iterator first, last; }; template class Slicer{ public: Slicer( T begin, T end, size_t page_size ){ this->Begin = begin; this->End = end; this->page_size = page_size; CutOnPage(); } size_t size() const{ return pages.size(); } typename vector>::iterator begin(){ return pages.begin(); } typename vector>::iterator end(){ return pages.end(); } void CutOnPage(){ T current_begin = this->Begin; while ( current_begin != this->End ){ pages.push_back({ current_begin, current_begin }); while ( pages.back().last != this->End && pages.back().size() <= this->page_size ){ pages.back().last++; } current_begin = pages.back().last; if ( current_begin != this->End ) { current_begin++; } } } T Begin, End; size_t page_size; vector > pages; }; template Slicer Slice(C&c, size_t page_size ){ Slicer main_pag(c.begin(), c.end(), page_size); return main_pag; }