Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. #include <iterator>
  2. #include <vector>
  3.  
  4. template <typename T, int m, int n>
  5. class Matrix {
  6. private:
  7.     std::vector<T> matrix;
  8. public:
  9.     Matrix(): matrix(m * n) {
  10.     }
  11.     class Row {
  12.     private:
  13.         std::vector<T>& matrix;
  14.         int rowIndex;
  15.     public:
  16.         Row(std::vector<T>& matrix, int rowIndex): matrix(matrix), rowIndex(rowIndex) {
  17.         }
  18.         T& operator [] (int columnIndex) {
  19.             return matrix[rowIndex * n + columnIndex];
  20.         }
  21.     };
  22.     Matrix::Row operator [] (int rowIndex) {
  23.         return Row(matrix, rowIndex);
  24.     }
  25.     class PositiveIterator: public std::iterator<std::forward_iterator_tag, int, ptrdiff_t, T*, T> {
  26.     private:
  27.         bool isDefault = true;
  28.         std::vector<T>& matrix;
  29.         int index;
  30.         void findNext() {
  31.             do {
  32.                 index++;
  33.             } while (index < matrix.size() && matrix[index] <= 0);
  34.             isDefault = index == matrix.size();
  35.         }
  36.         void findPrevious() {
  37.             do {
  38.                 index--;
  39.             } while (index >= 0 && matrix[index] <= 0);
  40.             isDefault = index == -1;
  41.         }
  42.     public:
  43.         PositiveIterator(std::vector<T>& matrix, bool isDefault): isDefault(false), matrix(matrix) {
  44.             index = isDefault ? m * n : -1;
  45.         }
  46.         bool operator == (PositiveIterator other) {
  47.             return (isDefault && other.isDefault) || (index == other.index);
  48.         }
  49.         bool operator != (PositiveIterator other) {
  50.             return !(*this == other);
  51.         }
  52.         T& operator * () {
  53.             if (isDefault) {
  54.                 throw "not initialized iterator";
  55.             }
  56.             switch (index) {
  57.                 case -1:
  58.                     findNext();
  59.                     break;
  60.                 case m * n:
  61.                     findPrevious();
  62.                     break;
  63.             }
  64.             return matrix[index];
  65.         }
  66.         PositiveIterator& operator ++ () {
  67.             if (isDefault) {
  68.                 throw "not initialized iterator";
  69.             }
  70.             findNext();
  71.             return *this;
  72.         }
  73.         PositiveIterator& operator ++ (int) {
  74.             PositiveIterator& tmp = *this;
  75.             operator++();
  76.             return tmp;
  77.         }
  78.         PositiveIterator& operator -- () {
  79.             if (isDefault) {
  80.                 throw "not initialized iterator";
  81.             }
  82.             findPrevious();
  83.             return *this;
  84.         }
  85.         PositiveIterator& operator -- (int) {
  86.             PositiveIterator& tmp = *this;
  87.             operator--();
  88.             return tmp;
  89.         }
  90.     };
  91.     PositiveIterator begin() {
  92.         return PositiveIterator(matrix, false);
  93.     }
  94.     PositiveIterator end() {
  95.         return PositiveIterator(matrix, true);
  96.     }
  97. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement