From 338d0975219b48e706820215ae593b464bbee55c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Tue, 23 Sep 2014 16:56:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0reverse=5Fiterator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TinySTL/ReverseIterator.h | 184 ++++++++++++++++++++++++++++++++ TinySTL/TinySTL.vcxproj | 2 + TinySTL/TinySTL.vcxproj.filters | 6 ++ 3 files changed, 192 insertions(+) create mode 100644 TinySTL/ReverseIterator.h diff --git a/TinySTL/ReverseIterator.h b/TinySTL/ReverseIterator.h new file mode 100644 index 0000000..1fc6bc8 --- /dev/null +++ b/TinySTL/ReverseIterator.h @@ -0,0 +1,184 @@ +#ifndef _REVERSE_ITERATOR_H_ +#define _REVERSE_ITERATOR_H_ + +#include "Iterator.h" + +namespace TinySTL{ + template + class reverse_iterator{ + public: + typedef Iterator iterator_type; + typedef typename iterator_traits::iterator_category iterator_category; + typedef typename iterator_traits::value_type value_type; + typedef typename iterator_traits::difference_type difference_type; + typedef typename iterator_traits::pointer pointer; + typedef typename iterator_traits::reference reference; + private: + Iterator base_; + Iterator cur_; + public: + //¹¹Ôì¡£¸´ÖÆ£¬Îö¹¹Ïà¹Ø + reverse_iterator() :base_(0), cur_(0){} + explicit reverse_iterator(iterator_type it) :base_(it), cur_(base_ - 1){} + template + reverse_iterator(const reverse_iterator& rev_it){ + base_ = (iterator_type)rev_it.base(); + cur_ = base_ - 1; + }; + + //ÆäËû³ÉÔ±º¯Êý + iterator_type base() const{ return base_; } + reference operator*() const{ return (*cur_); } + pointer operator->() const{ return &(operator *()); } + reverse_iterator& operator ++(){ + --base_; + --cur_; + return *this; + } + reverse_iterator& operator ++(int){ + reverse_iterator temp = *this; + ++(*this); + return temp; + } + reverse_iterator& operator--(){ + ++base_; + ++cur_; + return *this; + } + reverse_iterator operator--(int){ + reverse_iterator temp = *this; + --(*this); + return temp; + } + reference operator[] (difference_type n) const{ + return base()[-n - 1]; + } + reverse_iterator operator + (difference_type n) const; + reverse_iterator& operator += (difference_type n); + reverse_iterator operator - (difference_type n) const; + reverse_iterator& operator -= (difference_type n); + private: + Iterator advanceNStep(Iterator it, + difference_type n, + bool right,//true -> \ false <- + random_access_iterator_tag){ + if (right){ + it += n; + }else{ + it -= n; + } + return it; + } + Iterator advanceNStep(Iterator it, + difference_type n, + bool right,//true -> \ false <- + bidirectional_iterator_tag){ + difference_type i; + difference_type absN = n >= 0 ? n : -n; + if ((right && n > 0) || (!right && n < 0)){// -> + for (i = 0; i != absN; ++i){ + it = it + 1; + } + } + else if ((!right && n > 0) || (right && n < 0)){// <- + for (i = 0; i != absN; ++i){ + it = it - 1; + } + } + return it; + } + public: + template + friend bool operator == (const reverse_iterator& lhs, + const reverse_iterator& rhs); + template + friend bool operator != (const reverse_iterator& lhs, + const reverse_iterator& rhs); + template + friend bool operator < (const reverse_iterator& lhs, + const reverse_iterator& rhs); + template + friend bool operator <= (const reverse_iterator& lhs, + const reverse_iterator& rhs); + template + friend bool operator > (const reverse_iterator& lhs, + const reverse_iterator& rhs); + template + friend bool operator >= (const reverse_iterator& lhs, + const reverse_iterator& rhs); + + template + friend reverse_iterator operator + ( + typename reverse_iterator::difference_type n, + const reverse_iterator& rev_it); + template + friend typename reverse_iterator::difference_type operator- ( + const reverse_iterator& lhs, + const reverse_iterator& rhs); + };// end of reverse_iterator + + template + reverse_iterator& reverse_iterator::operator += (difference_type n){ + base_ = advanceNStep(base_, n, false, iterator_category()); + cur_ = advanceNStep(cur_, n, false, iterator_category()); + return *this; + } + template + reverse_iterator& reverse_iterator::operator -= (difference_type n){ + base_ = advanceNStep(base_, n, true, iterator_category()); + cur_ = advanceNStep(cur_, n, true, iterator_category()); + return *this; + } + template + reverse_iterator reverse_iterator::operator + (difference_type n) const{ + reverse_iterator res = *this; + res += n; + return res; + } + template + reverse_iterator reverse_iterator::operator - (difference_type n) const{ + reverse_iterator res = *this; + res -= n; + return res; + } + + template + bool operator == (const reverse_iterator& lhs, const reverse_iterator& rhs){ + return lhs.cur_ == rhs.cur_; + } + template + bool operator != (const reverse_iterator& lhs, const reverse_iterator& rhs){ + return !(lhs == rhs); + } + template + bool operator < (const reverse_iterator& lhs, const reverse_iterator& rhs){ + return lhs.cur_ < rhs.cur_; + } + template + bool operator > (const reverse_iterator& lhs, const reverse_iterator& rhs){ + return lhs.cur_ > rhs.cur_; + } + template + bool operator >= (const reverse_iterator& lhs, const reverse_iterator& rhs){ + return !(lhs < rhs); + } + template + bool operator <= (const reverse_iterator& lhs, const reverse_iterator& rhs){ + return !(lhs > rhs); + } + + template + reverse_iterator operator + ( + typename reverse_iterator::difference_type n, + const reverse_iterator& rev_it){ + return rev_it + n; + } + template + typename reverse_iterator::difference_type operator - ( + const reverse_iterator& lhs, + const reverse_iterator& rhs){ + return lhs.cur_ - rhs.cur_; + } +} + +#endif \ No newline at end of file diff --git a/TinySTL/TinySTL.vcxproj b/TinySTL/TinySTL.vcxproj index cfb06b4..28f5850 100644 --- a/TinySTL/TinySTL.vcxproj +++ b/TinySTL/TinySTL.vcxproj @@ -86,6 +86,8 @@ + + diff --git a/TinySTL/TinySTL.vcxproj.filters b/TinySTL/TinySTL.vcxproj.filters index 12aff99..5fd5a09 100644 --- a/TinySTL/TinySTL.vcxproj.filters +++ b/TinySTL/TinySTL.vcxproj.filters @@ -53,5 +53,11 @@ 头文件\Profiler + + 头文件 + + + 头文件 + \ No newline at end of file