From 299262702328c6aa258c9ab4a388f6cb38be52c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Wed, 11 Feb 2015 16:52:33 +0800 Subject: [PATCH] add const_iterator --- TinySTL/Detail/List.impl.h | 34 ++++++++++++++++++++++++++++++++++ TinySTL/List.h | 12 ++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/TinySTL/Detail/List.impl.h b/TinySTL/Detail/List.impl.h index d52b1b2..2712884 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 99aef1b..fc6d393 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); -- GitLab