1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | class range { private: const int start, stop, step; public: typedef int64_t difference_type; class iterator { private: size_t idx; range& parent; public: iterator(range& x, int64_t a = 0) : idx(a), parent(x) {} int64_t operator * () { return parent.start + parent.step * idx; } iterator& operator ++ () { idx++; return *this; } iterator& operator -- () { idx--; return *this; } iterator operator ++ (int) { iterator tmp(*this); idx++; return tmp; } iterator operator -- (int) { iterator tmp(*this); idx--; return tmp; } iterator operator + (int64_t a) { return iterator(parent, idx + a); } iterator operator - (int64_t a) { return iterator(parent, idx - a); } bool operator != (iterator a) { return (&parent != &a.parent || idx != a.idx); } }; range(int64_t stop) : start(0), stop(stop), step(1) {}; range(int64_t start, int64_t stop, int64_t step = 1) : start(start), stop(stop), step(step) {}; iterator begin() { return iterator(*this); } iterator end() { return iterator(*this, (stop - start + step - 1) / step); } int64_t operator [] (int64_t a) { if (a >= (stop - start + step - 1) / step) throw std::out_of_range(""); return start + a * step; } }; | cs |
근데 range(0, INT64_MAX, 3)같은거 돌리면 잘 안돌아간다
뭐 당연히 오버플로우 때문이겠지? 근데 bigint같은거 쓰는건 좀 오바떠는것같아
사짜 이터레이터라 범위 잡아서 벡터에 복사해넣는것도 안돌아가네ㅋㅋㅋㅋ