#include #include #include using namespace std; template class Pole { public: class iterator; Pole(size_t chunk = 100) : chunk_(chunk), size_(0) {} void push_back(const T& x) { resize(++size_); (*this)[size_ - 1] = x; } T& operator[] (size_t i) { return hrabe_[i / chunk_][i%chunk_]; } T& at(size_t i) { check(i); return (*this)[i]; } iterator begin() { return iterator(*this, 0); } iterator end() { return iterator(*this, size_); } private: void check(size_t i) { if (i >= size_) throw out_of_range("Out of range"); } void resize(size_t i) { for (size_t k = hrabe_.size(); k <= i / chunk_; ++k) hrabe_.push_back(make_unique< T[]>(chunk_)); } size_t chunk_; size_t size_; vector< unique_ptr> hrabe_; }; template class Pole::iterator { public: iterator(Pole& pole, size_t i) : pole_(pole), i_(i) {} T& operator*() { return pole_[i_]; } bool operator!=(const iterator& other) { return i_ != other.i_; } iterator& operator++() { i_++; return *this; } iterator& operator++(int) { iterator it(*this); (*this)++; return it; } private: size_t i_; Pole& pole_; }; int main() { Pole p; p.push_back(42); p.push_back(43); p.push_back(44); cout << p[0] << ' ' << p.at(1) << ' ' << p.at(2) << endl; for (Pole::iterator it = p.begin(); it != p.end(); ++it) { cout << *it << ' '; } cout << endl; for (auto n : p) { cout << n << ' '; } return 0; }