diff --git a/TinySTL/Detail/List.impl.h b/TinySTL/Detail/List.impl.h index d52b1b23a2d269e3bb0ebd0a1e9533dbac58e4fa..2712884ac72a6ef54d7c5f462e5560d5250c066e 100644 --- a/TinySTL/Detail/List.impl.h +++ b/TinySTL/Detail/List.impl.h @@ -214,6 +214,40 @@ namespace TinySTL{ erase(begin(), end()); } template + typename list::iterator list::begin(){ + return head; + } + template + typename list::iterator list::end(){ + return tail; + } + template + typename list::const_iterator list::changeIteratorToConstIterator(iterator& it)const{ + using nodeP = Detail::node*; + auto temp = (list*const)this; + auto ptr = it.p; + Detail::node node(ptr->data, (nodeP)(ptr->prev), (nodeP)(ptr->next), temp); + return const_iterator(&node); + } + template + typename list::const_iterator list::begin()const{ + auto temp = (list*const)this; + return changeIteratorToConstIterator(temp->head); + } + template + typename list::const_iterator list::end()const{ + auto temp = (list*const)this; + return changeIteratorToConstIterator(temp->tail); + } + template + typename list::reverse_iterator list::rbegin(){ + return reverse_iterator(tail); + } + template + typename list::reverse_iterator list::rend(){ + return reverse_iterator(head); + } + template void list::reverse(){//²ÉÓÃβ²å·¨ if (empty() || head.p->next == tail.p) return; auto curNode = head.p; diff --git a/TinySTL/List.h b/TinySTL/List.h index 99aef1b2972a34558f33cddeeadf9a7ce3267f0a..fc6d393c190d5d258e292a333134ffa948ff4f96 100644 --- a/TinySTL/List.h +++ b/TinySTL/List.h @@ -62,6 +62,7 @@ namespace TinySTL{ public: typedef T value_type; typedef Detail::listIterator iterator; + typedef Detail::listIterator const_iterator; typedef reverse_iterator_t reverse_iterator; typedef T& reference; typedef size_t size_type; @@ -87,10 +88,12 @@ namespace TinySTL{ void push_back(const value_type& val); void pop_back(); - iterator begin(){ return head; } - iterator end(){ return tail; } - reverse_iterator rbegin(){ return reverse_iterator(tail); } - reverse_iterator rend(){ return reverse_iterator(head); } + iterator begin(); + iterator end(); + const_iterator begin()const; + const_iterator end()const; + reverse_iterator rbegin(); + reverse_iterator rend(); iterator insert(iterator position, const value_type& val); void insert(iterator position, size_type n, const value_type& val); @@ -125,6 +128,7 @@ namespace TinySTL{ void insert_aux(iterator position, size_type n, const T& val, std::true_type); template void insert_aux(iterator position, InputIterator first, InputIterator last, std::false_type); + const_iterator changeIteratorToConstIterator(iterator& it)const; public: template friend void swap(list& x, list& y);