From fc5d2733fa831e7d9adad4a590aea649dde40085 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, 26 Nov 2014 11:29:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90insert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TinySTL/List.h | 62 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/TinySTL/List.h b/TinySTL/List.h index 31f83fb..f4c386e 100644 --- a/TinySTL/List.h +++ b/TinySTL/List.h @@ -6,6 +6,8 @@ #include "ReverseIterator.h" #include "UninitializedFunctions.h" +#include + namespace TinySTL{ template class List; @@ -92,9 +94,8 @@ namespace TinySTL{ head.p = newNode();//add a dummy node tail.p = head.p; } - /*List(const List& list){ - - }*/ + List(const List& list) = delete; + List& operator = (const List& list) = delete; ~List(){ for (; head != tail;){ auto temp = head++; @@ -124,6 +125,31 @@ namespace TinySTL{ iterator end(){ return tail; } reverse_iterator rbegin(){ return reverse_iterator(tail); } reverse_iterator rend(){ return reverse_iterator(head); } + + iterator insert(iterator position, const value_type& val); + void insert(iterator position, size_type n, const value_type& val); + template + void insert(iterator position, InputIterator first, InputIterator last); + //iterator erase(iterator position); + //iterator erase(iterator first, iterator last); + //void swap(List& x); + //void clear(); + //void splice(iterator position, list& x); + //void splice(iterator position, list& x, iterator i); + //void splice(iterator position, list& x, iterator first, iterator last); + //void remove(const value_type& val); + //template + //void remove_if(Predicate pred); + //void unique(); + //template + //void unique(BinaryPredicate binary_pred); + //void merge(list& x); + //template + //void merge(list& x, Compare comp); + //void sort(); + //template + //void sort(Compare comp); + //void reverse(); private: nodePtr newNode(const T& val = T()){ nodePtr res = nodeAllocator::allocate(); @@ -138,6 +164,17 @@ namespace TinySTL{ p->next = nullptr; nodeAllocator::deallocate(p); } + void insert_aux(iterator position, size_type n, const T& val, std::true_type){ + for (auto i = n; i != 0; --i){ + position = insert(position, val); + } + } + template + void insert_aux(iterator position, InputIterator first, InputIterator last, std::false_type){ + for (; first != last; ++first){ + insert(position, *first); + } + } }; template void List::push_front(const value_type& val){ @@ -168,6 +205,25 @@ namespace TinySTL{ deleteNode(tail.p); tail.p = newTail; } + template + typename List::iterator List::insert(iterator position, const value_type& val){ + auto node = newNode(val); + auto prev = position.p->prev; + node->next = position.p; + node->prev = prev; + prev->next = node; + position.p->prev = node; + return iterator(node); + } + template + 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){ + insert_aux(position, first, last, typename std::is_integral::type()); + } } #endif \ No newline at end of file