From 33c8e9b462cde4423bdbd44c7e28d1bcd13a5edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Fri, 28 Nov 2014 16:34:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90unique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TinySTL/List.h | 103 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 31 deletions(-) diff --git a/TinySTL/List.h b/TinySTL/List.h index d6cf168..fa8c330 100644 --- a/TinySTL/List.h +++ b/TinySTL/List.h @@ -10,7 +10,7 @@ namespace TinySTL{ template - class List; + class list; namespace{ //the class of node template @@ -18,8 +18,8 @@ namespace TinySTL{ T data; node *prev; node *next; - List *container; - node(const T& d, node *p, node *n, List *c): + list *container; + node(const T& d, node *p, node *n, list *c): data(d), prev(p), node(n), container(c){} bool operator ==(const node& n){ return data == n.data && prev == n.prev && next == n.next && container == n.container; @@ -29,7 +29,7 @@ namespace TinySTL{ template struct listIterator :public bidirectional_iterator{ template - friend class List; + friend class list; private: typedef node* nodePtr; nodePtr p; @@ -72,9 +72,9 @@ namespace TinySTL{ } }//end of namespace - //the class of List + //the class of list template - class List{ + class list{ template friend struct listIterator; private: @@ -90,13 +90,13 @@ namespace TinySTL{ iterator head; iterator tail; public: - List(){ + list(){ head.p = newNode();//add a dummy node tail.p = head.p; } - List(const List& list) = delete; - List& operator = (const List& list) = delete; - ~List(){ + list(const list& list) = delete; + list& operator = (const list& list) = delete; + ~list(){ for (; head != tail;){ auto temp = head++; nodeAllocator::deallocate(temp.p); @@ -132,7 +132,7 @@ namespace TinySTL{ void insert(iterator position, InputIterator first, InputIterator last); iterator erase(iterator position); iterator erase(iterator first, iterator last); - void swap(List& x); + void swap(list& x); void clear(); //void splice(iterator position, list& x); //void splice(iterator position, list& x, iterator i); @@ -140,9 +140,9 @@ namespace TinySTL{ void remove(const value_type& val); template void remove_if(Predicate pred); - //void unique(); - //template - //void unique(BinaryPredicate binary_pred); + void unique(); + template + void unique(BinaryPredicate binary_pred); //void merge(list& x); //template //void merge(list& x, Compare comp); @@ -177,24 +177,24 @@ namespace TinySTL{ } public: template - friend void swap(List& x, List& y); + friend void swap(list& x, list& y); }; template - void List::push_front(const value_type& val){ + void list::push_front(const value_type& val){ auto node = newNode(val); head.p->prev = node; node->next = head.p; head.p = node; } template - void List::pop_front(){ + void list::pop_front(){ auto oldNode = head.p; head.p = oldNode->next; head.p->prev = nullptr; deleteNode(oldNode); } template - void List::push_back(const value_type& val){ + void list::push_back(const value_type& val){ auto node = newNode(); (tail.p)->data = val; (tail.p)->next = node; @@ -202,14 +202,14 @@ namespace TinySTL{ tail.p = node; } template - void List::pop_back(){ + void list::pop_back(){ auto newTail = tail.p->prev; newTail->next = nullptr; deleteNode(tail.p); tail.p = newTail; } template - typename List::iterator List::insert(iterator position, const value_type& val){ + typename list::iterator list::insert(iterator position, const value_type& val){ auto node = newNode(val); auto prev = position.p->prev; node->next = position.p; @@ -219,16 +219,16 @@ namespace TinySTL{ return iterator(node); } template - void List::insert(iterator position, size_type n, const value_type& val){ + void list::insert(iterator position, size_type n, const value_type& val){ insert_aux(position, n, val, typename std::is_integral::type()); } template template - void List::insert(iterator position, InputIterator first, InputIterator last){ + void list::insert(iterator position, InputIterator first, InputIterator last){ insert_aux(position, first, last, typename std::is_integral::type()); } template - typename List::iterator List::erase(iterator position){ + typename list::iterator list::erase(iterator position){ if (position == head){ pop_front(); return head; @@ -241,8 +241,8 @@ namespace TinySTL{ } } template - typename List::iterator List::erase(iterator first, iterator last){ - typename List::iterator res; + typename list::iterator list::erase(iterator first, iterator last){ + typename list::iterator res; for (; first != last; ){ auto temp = first++; res = erase(temp); @@ -250,11 +250,11 @@ namespace TinySTL{ return res; } template - void List::clear(){ + void list::clear(){ erase(begin(), end()); } template - void List::reverse(){//采用尾插法 + void list::reverse(){//采用尾插法 if (empty() || head.p->next == tail.p) return; auto curNode = head.p; head.p = tail.p->prev; @@ -269,7 +269,7 @@ namespace TinySTL{ } while (curNode != head.p); } template - void List::remove(const value_type& val){ + void list::remove(const value_type& val){ for (auto it = begin(); it != end();){ if (*it == val) it = erase(it); @@ -279,7 +279,7 @@ namespace TinySTL{ } template template - void List::remove_if(Predicate pred){ + void list::remove_if(Predicate pred){ for (auto it = begin(); it != end();){ if (pred(*it)) it = erase(it); @@ -288,14 +288,55 @@ namespace TinySTL{ } } template - void List::swap(List& x){ + void list::swap(list& x){ TinySTL::swap(head.p, x.head.p); TinySTL::swap(tail.p, x.tail.p); } template - void swap(List& x, List& y){ + void swap(list& x, list& y){ x.swap(y); } + template + void list::unique(){ + nodePtr curNode = head.p; + while (curNode != tail.p){ + nodePtr nextNode = curNode->next; + if (curNode->data == nextNode->data){ + if (nextNode == tail.p){ + curNode->next = nullptr; + tail.p = curNode; + }else{ + curNode->next = nextNode->next; + nextNode->next->prev = curNode; + } + deleteNode(nextNode); + }else{ + curNode = nextNode; + } + } + } + template + template + void list::unique(BinaryPredicate binary_pred){ + nodePtr curNode = head.p; + while (curNode != tail.p){ + nodePtr nextNode = curNode->next; + if (binary_pred(curNode->data, nextNode->data)){ + if (nextNode == tail.p){ + curNode->next = nullptr; + tail.p = curNode; + } + else{ + curNode->next = nextNode->next; + nextNode->next->prev = curNode; + } + deleteNode(nextNode); + } + else{ + curNode = nextNode; + } + } + } } #endif \ No newline at end of file