Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- template <class Iterator>
- class IteratorRange {
- public:
- IteratorRange(Iterator begin, Iterator end) : begin_(begin), end_(end) {
- }
- Iterator begin() const { // NOLINT
- return begin_;
- }
- Iterator end() const { // NOLINT
- return end_;
- }
- private:
- Iterator begin_, end_;
- };
- template <typename Number>
- class RangeIter {
- public:
- RangeIter(Number number, Number step = 1) : number_(number), step_(step) {
- }
- Number& operator*() {
- return number_;
- }
- RangeIter& operator++() {
- number_ += step_;
- return *this;
- }
- bool operator!=(const RangeIter& rhs) {
- return number_ < rhs.number_;
- }
- private:
- Number number_;
- Number step_;
- };
- template <class FirstIter, class SecondIter>
- class ZipIter {
- public:
- ZipIter(FirstIter first_iter, SecondIter second_iter) : pair_({first_iter, second_iter}) {
- }
- template <class First, class Second>
- std::pair<First, Second>& operator*() {
- return {*pair_.first, *pair_.second};
- }
- ZipIter& operator++() {
- ++pair_.first;
- ++pair_.second;
- return *this;
- }
- bool operator!=(const ZipIter& rhs) {
- return (pair_.frist != rhs.pair_.first || pair_.second != rhs.pair_.second);
- }
- private:
- std::pair<FirstIter, SecondIter> pair_;
- };
- template <typename Number>
- IteratorRange<RangeIter<Number>> Range(Number from, Number to, int step = 1) {
- return IteratorRange<RangeIter<Number>>(RangeIter<Number>(from, step),
- RangeIter<Number>(to));
- }
- template <typename Number>
- IteratorRange<RangeIter<Number>> Range(Number to) {
- return IteratorRange<RangeIter<Number>>(RangeIter<Number>(0), RangeIter<Number>(to - 1));
- }
- template <typename First, typename Second, class FirstIter, class SecondIter>
- auto Zip(First first, Second second) {
- return IteratorRange<ZipIter<FirstIter, SecondIter>>(ZipIter<FirstIter, SecondIter>(first.begin(), second.begin()), ZipIter<FirstIter, SecondIter>(first.end(), second.end()));
- }
- int main() {
- int a = 1;
- int b = 5;
- for (auto item : Range(5)) {
- std::cout << item << " ";
- }
- std::vector<int> c = {1, 2, 3, 4};
- for (const auto& elem : Zip(c, Range(5, 9))) {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement