Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. template <class Iterator>
  5. class IteratorRange {
  6.    public:
  7.     IteratorRange(Iterator begin, Iterator end) : begin_(begin), end_(end) {
  8.     }
  9.  
  10.     Iterator begin() const {  // NOLINT
  11.         return begin_;
  12.     }
  13.  
  14.     Iterator end() const {  // NOLINT
  15.         return end_;
  16.     }
  17.  
  18.    private:
  19.     Iterator begin_, end_;
  20. };
  21.  
  22. template <typename Number>
  23. class RangeIter {
  24.    public:
  25.     RangeIter(Number number, Number step = 1) : number_(number), step_(step) {
  26.     }
  27.  
  28.     Number& operator*() {
  29.         return number_;
  30.     }
  31.  
  32.     RangeIter& operator++() {
  33.         number_ += step_;
  34.         return *this;
  35.     }
  36.  
  37.     bool operator!=(const RangeIter& rhs) {
  38.         return number_ < rhs.number_;
  39.     }
  40.  
  41.    private:
  42.     Number number_;
  43.     Number step_;
  44. };
  45.  
  46. template <class FirstIter, class SecondIter>
  47. class ZipIter {
  48.    public:
  49.     ZipIter(FirstIter first_iter, SecondIter second_iter) : pair_({first_iter, second_iter}) {
  50.     }
  51.  
  52.     template <class First, class Second>
  53.     std::pair<First, Second>& operator*() {
  54.         return {*pair_.first, *pair_.second};
  55.     }
  56.  
  57.     ZipIter& operator++() {
  58.         ++pair_.first;
  59.         ++pair_.second;
  60.         return *this;
  61.     }
  62.  
  63.     bool operator!=(const ZipIter& rhs) {
  64.         return (pair_.frist != rhs.pair_.first || pair_.second != rhs.pair_.second);
  65.     }
  66.  
  67.    private:
  68.     std::pair<FirstIter, SecondIter> pair_;
  69. };
  70.  
  71. template <typename Number>
  72. IteratorRange<RangeIter<Number>> Range(Number from, Number to, int step = 1) {
  73.     return IteratorRange<RangeIter<Number>>(RangeIter<Number>(from, step),
  74.                                             RangeIter<Number>(to));
  75. }
  76.  
  77. template <typename Number>
  78. IteratorRange<RangeIter<Number>> Range(Number to) {
  79.     return IteratorRange<RangeIter<Number>>(RangeIter<Number>(0), RangeIter<Number>(to - 1));
  80. }
  81.  
  82. template <typename First, typename Second, class FirstIter, class SecondIter>
  83. auto Zip(First first, Second second) {
  84.     return IteratorRange<ZipIter<FirstIter, SecondIter>>(ZipIter<FirstIter, SecondIter>(first.begin(), second.begin()), ZipIter<FirstIter, SecondIter>(first.end(), second.end()));
  85. }
  86.  
  87. int main() {
  88.     int a = 1;
  89.     int b = 5;
  90.     for (auto item : Range(5)) {
  91.         std::cout << item << " ";
  92.     }
  93.  
  94.     std::vector<int> c = {1, 2, 3, 4};
  95.     for (const auto& elem : Zip(c, Range(5, 9))) {
  96.     }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement