Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iterator>
- namespace nsp
- {
- template <class element_type, class element_allocator_type = std::allocator<element_type> >
- class test_container
- {
- private:
- element_type numbers[50];
- friend class iterator;
- friend class reverse_iterator;
- public:
- class reverse_iterator; //forward decl
- class iterator : public std::iterator<std::bidirectional_iterator_tag, element_type>
- {
- private:
- element_type *i;
- template <class distance_type>
- friend void advance(reverse_iterator &rit, distance_type n);
- public:
- iterator() {}
- iterator(element_type &_i)
- {
- i = &(_i);
- }
- element_type & operator *()
- {
- return *i;
- }
- iterator & operator = (const element_type &source_i)
- {
- i = &(source_i);
- return *this;
- }
- iterator & operator = (const iterator &source)
- {
- i = source.i;
- return *this;
- }
- bool operator != (const iterator rh)
- {
- return i != rh.i;
- }
- iterator & operator ++()
- {
- ++i;
- return *this;
- }
- iterator & operator --()
- {
- --i;
- return *this;
- }
- template <class distance_type>
- friend void advance(iterator &it, distance_type n)
- {
- it.i += n;
- }
- friend typename std::iterator_traits<iterator>::difference_type distance(const iterator &first, const iterator &last)
- {
- return last.i - first.i;
- }
- };
- class reverse_iterator : public std::iterator<std::bidirectional_iterator_tag, element_type>
- {
- private:
- iterator it;
- public:
- reverse_iterator(element_type &_i)
- {
- it.i = _i;
- }
- reverse_iterator(const iterator &source)
- {
- it = source;
- }
- element_type & operator *()
- {
- return *it;
- }
- element_type & operator = (const reverse_iterator &source)
- {
- it = source.it;
- return *this;
- }
- element_type & operator = (const iterator &source)
- {
- it = source;
- return *this;
- }
- bool operator != (const iterator rh)
- {
- return it != rh.it;
- }
- reverse_iterator & operator ++()
- {
- --it;
- return *this;
- }
- reverse_iterator & operator --()
- {
- ++it;
- return *this;
- }
- template <class distance_type>
- friend void advance(reverse_iterator &rit, distance_type n)
- {
- rit.it.i -= n;
- }
- friend typename std::iterator_traits<reverse_iterator>::difference_type distance(const reverse_iterator &first, const reverse_iterator &last)
- {
- return distance(last.it, first.it);
- }
- };
- iterator begin()
- {
- return iterator(numbers[0]);
- }
- iterator end()
- {
- return iterator(numbers[50]);
- }
- };
- }
- int main(int argc, char **argv)
- {
- nsp::test_container<int> stuff;
- int counter = 0;
- for (nsp::test_container<int>::iterator it = stuff.begin(); it != stuff.end(); ++it)
- {
- *it = counter++;
- }
- nsp::test_container<int>::iterator it = stuff.begin(), it2 = stuff.begin();
- using namespace std;
- std::cout << *it << std::endl;
- ++it;
- --it;
- ++it;
- std::cout << *it << std::endl;
- advance(it, 2);
- std::cout << *it << std::endl;
- std::advance(it, 2);
- std::cout << *it << std::endl;
- int distance_between = distance(it2, it);
- std::cout << distance_between << std::endl;
- nsp::test_container<int>::reverse_iterator rit = it, rit2 = it2;
- --rit;
- ++rit;
- advance(rit, -2);
- distance_between = distance(rit2, rit);
- std::cout << distance_between << std::endl;
- std::cin.get();
- return 0;
- }
- #include <iostream>
- #include <iterator>
- namespace nsp
- {
- template <class element_type, class element_allocator_type = std::allocator<element_type> >
- class test_container
- {
- private:
- element_type numbers[50];
- friend class iterator;
- friend class reverse_iterator;
- public:
- class reverse_iterator; //forward decl
- class iterator : public std::iterator<std::bidirectional_iterator_tag, element_type>
- {
- private:
- element_type *i;
- template <class distance_type>
- friend void advance(reverse_iterator &rit, distance_type n);
- public:
- iterator() {}
- iterator(element_type &_i)
- {
- i = &(_i);
- }
- element_type & operator *()
- {
- return *i;
- }
- iterator & operator = (const element_type &source_i)
- {
- i = &(source_i);
- return *this;
- }
- iterator & operator = (const iterator &source)
- {
- i = source.i;
- return *this;
- }
- bool operator != (const iterator rh)
- {
- return i != rh.i;
- }
- iterator & operator ++()
- {
- ++i;
- return *this;
- }
- iterator & operator --()
- {
- --i;
- return *this;
- }
- template <class distance_type>
- friend void advance(iterator &it, distance_type n)
- {
- it.i += n;
- }
- friend typename std::iterator_traits<iterator>::difference_type distance(const iterator &first, const iterator &last)
- {
- return last.i - first.i;
- }
- };
- class reverse_iterator : public std::iterator<std::bidirectional_iterator_tag, element_type>
- {
- private:
- typename test_container::iterator it;
- public:
- reverse_iterator(element_type &_i)
- {
- it.i = _i;
- }
- reverse_iterator(const typename test_container::iterator &source)
- {
- it = source;
- }
- element_type & operator *()
- {
- return *it;
- }
- element_type & operator = (const reverse_iterator &source)
- {
- it = source.it;
- return *this;
- }
- element_type & operator = (const typename test_container::iterator &source)
- {
- it = source;
- return *this;
- }
- bool operator != (const typename test_container::iterator rh)
- {
- return it != rh.it;
- }
- reverse_iterator & operator ++()
- {
- --it;
- return *this;
- }
- reverse_iterator & operator --()
- {
- ++it;
- return *this;
- }
- template <class distance_type>
- friend void advance(reverse_iterator &rit, distance_type n)
- {
- rit.it.i -= n;
- }
- friend typename std::iterator_traits<reverse_iterator>::difference_type distance(const reverse_iterator &first, const reverse_iterator &last)
- {
- return distance(last.it, first.it);
- }
- };
- iterator begin()
- {
- return iterator(numbers[0]);
- }
- iterator end()
- {
- return iterator(numbers[50]);
- }
- };
- }
- int main(int argc, char **argv)
- {
- nsp::test_container<int> stuff;
- int counter = 0;
- for (nsp::test_container<int>::iterator it = stuff.begin(); it != stuff.end(); ++it)
- {
- *it = counter++;
- }
- nsp::test_container<int>::iterator it = stuff.begin(), it2 = stuff.begin();
- using namespace std;
- std::cout << *it << std::endl;
- ++it;
- --it;
- ++it;
- std::cout << *it << std::endl;
- advance(it, 2);
- std::cout << *it << std::endl;
- std::advance(it, 2);
- std::cout << *it << std::endl;
- int distance_between = distance(it2, it);
- std::cout << distance_between << std::endl;
- nsp::test_container<int>::reverse_iterator rit = it, rit2 = it2;
- --rit;
- ++rit;
- advance(rit, -2);
- distance_between = distance(rit2, rit);
- std::cout << distance_between << std::endl;
- std::cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement