Advertisement
Guest User

Bad variant of iterators in C++

a guest
Nov 17th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.97 KB | None | 0 0
  1. #include <list>
  2. #include <vector>
  3.  
  4. template<class T>
  5. class VectorList
  6. {
  7.     using VectT = std::vector<T>;
  8.     using ListT = std::list<VectT>;
  9.  
  10.     ListT data_;
  11.  
  12. public:
  13.     template<typename TypeValue> class Iterator;
  14.     template<typename TypeValue> class ConstIterator;
  15.  
  16.     using value_type = T;
  17.     using iterator = Iterator<value_type>;
  18.     using const_iterator = ConstIterator<value_type>;
  19.     using const_reverse_iterator = std::reverse_iterator<const_iterator>;
  20.  
  21.     VectorList() = default;
  22.     VectorList(VectorList const&) = default;
  23.     VectorList(VectorList &&) = default;
  24.  
  25.     VectorList & operator=(VectorList &&)     = default;
  26.     VectorList & operator=(VectorList const&) = default;
  27.  
  28.     // метод, который будет использоваться для заполнения VectorList
  29.     // гарантирует, что в списке не будет пустых массивов
  30.     template<class It>
  31.     void append(It p, It q);
  32.    
  33.     bool empty() const { return size() == 0; }
  34.  
  35.     // определите метод size
  36.     size_t size() const
  37.     {
  38.         size_t size = 0;
  39.         for (VectT const& vec : data_) {
  40.             size += vec.size();
  41.         }
  42.         return size;
  43.     }
  44.  
  45.     // определите const_iterator
  46.     iterator begin() { return iterator(&data_, 0); }
  47.     iterator end()   { return iterator(&data_);    }
  48.  
  49.     const_iterator cbegin() { return const_iterator(&data_, 0); }
  50.     const_iterator cend()   { return const_iterator(&data_);    }
  51.  
  52.     const_reverse_iterator rbegin() { return const_reverse_iterator(cend());   }
  53.     const_reverse_iterator rend()   { return const_reverse_iterator(cbegin()); }
  54.    
  55.     template<typename TypeValue>
  56.     class Iterator : public std::iterator<std::bidirectional_iterator_tag, TypeValue> {
  57.         friend class VectorList;
  58.         friend class Iterator;
  59.  
  60.             ListT * data_;
  61.             typename ListT::iterator list_;
  62.             typename VectT::iterator vec_;
  63.  
  64.             Iterator(ListT * data) : data_(data)
  65.             {
  66.                 if (data->begin() == data->end()) {
  67.                     list_ = data->begin();
  68.                     vec_ =  typename VectT::iterator();
  69.                 } else {
  70.                     list_ = std::prev(data->end());
  71.                     vec_  = (*list_).end();
  72.                 }
  73.             }
  74.  
  75.             Iterator(ListT * data, size_t n) : data_(data)
  76.             {
  77.                 if (data->begin() == data->end()) {
  78.                     list_ = data->begin();
  79.                     vec_  = typename VectT::iterator();
  80.                 } else {
  81.                     list_ = data->begin();
  82.                     vec_  = (*list_).begin();
  83.                 }
  84.             }
  85.  
  86.         public:
  87.             Iterator() = default;
  88.             Iterator(Iterator const& other)
  89.                 : data_(other.data_), list_(other.list_), vec_(other.vec_) {}
  90.  
  91.             bool operator==(Iterator const& other) const
  92.             {
  93.                 return list_ == other.list_ && vec_ == other.vec_;
  94.             }
  95.  
  96.             bool operator!=(Iterator const& other) const
  97.             {
  98.                 return !(*this == other);
  99.             }
  100.                
  101.             typename Iterator::reference operator*()  { return *vec_;    }
  102.             typename Iterator::pointer   operator->() { return &(*vec_); }
  103.            
  104.             Iterator& operator++()
  105.             {
  106.                 if (++vec_ == (*list_).end())
  107.                     if (list_ != std::prev(data_->end()))
  108.                         vec_ = (*(++list_)).begin();
  109.                 return *this;
  110.             }
  111.  
  112.             Iterator operator++(int)
  113.             {
  114.                 Iterator prev(*this);
  115.                 ++(*this);
  116.                 return prev;
  117.             }
  118.  
  119.             Iterator& operator--()
  120.             {
  121.                 if (--vec_ == std::prev((*list_).begin()))
  122.                     if (list_ != data_->begin())
  123.                         vec_ = std::prev((*(--list_)).end());
  124.                 return *this;
  125.             }
  126.  
  127.             Iterator operator--(int)
  128.             {
  129.                 Iterator prev(*this);
  130.                 --(*this);
  131.                 return prev;
  132.             }
  133.     };
  134.    
  135.     template<typename TypeValue>
  136.     class ConstIterator : public std::iterator<std::bidirectional_iterator_tag, const TypeValue> {
  137.         friend class VectorList;
  138.  
  139.             ListT * data_;
  140.             typename ListT::iterator list_;
  141.             typename VectT::iterator vec_;
  142.  
  143.             ConstIterator(ListT * data) : data_(data)
  144.             {
  145.                 if (data->begin() == data->end()) {
  146.                     list_ = data->begin();
  147.                     vec_ =  typename VectT::iterator();
  148.                 } else {
  149.                     list_ = std::prev(data->end());
  150.                     vec_  = (*list_).end();
  151.                 }
  152.             }
  153.  
  154.             ConstIterator(ListT * data, size_t n) : data_(data)
  155.             {
  156.                 if (data->begin() == data->end()) {
  157.                     list_ = data->begin();
  158.                     vec_  = typename VectT::iterator();
  159.                 } else {
  160.                     list_ = data->begin();
  161.                     vec_  = (*list_).begin();
  162.                 }
  163.             }
  164.  
  165.         public:
  166.             ConstIterator() = default;
  167.             ConstIterator(ConstIterator const& other)
  168.                 : data_(other.data_), list_(other.list_), vec_(other.vec_) {}
  169.             ConstIterator(Iterator<TypeValue> const& other)
  170.                 : data_(other.data_), list_(other.list_), vec_(other.vec_) {}
  171.  
  172.             bool operator==(ConstIterator const& other) const
  173.             {
  174.                 return list_ == other.list_ && vec_ == other.vec_;
  175.             }
  176.  
  177.             bool operator!=(ConstIterator const& other) const
  178.             {
  179.                 return !(*this == other);
  180.             }
  181.                
  182.             typename ConstIterator::reference operator*()  const { return *vec_;    }
  183.             typename ConstIterator::pointer   operator->() const { return &(*vec_); }
  184.            
  185.             ConstIterator& operator++()
  186.             {
  187.                 if (++vec_ == (*list_).end())
  188.                     if (list_ != std::prev(data_->end()))
  189.                         vec_ = (*(++list_)).begin();
  190.                 return *this;
  191.             }
  192.  
  193.             ConstIterator operator++(int)
  194.             {
  195.                 ConstIterator prev(*this);
  196.                 ++(*this);
  197.                 return prev;
  198.             }
  199.  
  200.             ConstIterator& operator--()
  201.             {
  202.                 if (--vec_ == std::prev((*list_).begin()))
  203.                     if (list_ != data_->begin())
  204.                         vec_ = std::prev((*(--list_)).end());
  205.                 return *this;
  206.             }
  207.  
  208.             ConstIterator operator--(int)
  209.             {
  210.                 ConstIterator prev(*this);
  211.                 --(*this);
  212.                 return prev;
  213.             }
  214.     };
  215. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement