From f41ffea6571ca20f8fcfd6227364d8850db4b672 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 19:43:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90splice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TinySTL/List.h | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/TinySTL/List.h b/TinySTL/List.h index fa8c330..bd7b3ad 100644 --- a/TinySTL/List.h +++ b/TinySTL/List.h @@ -134,9 +134,9 @@ namespace TinySTL{ 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 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); @@ -337,6 +337,39 @@ namespace TinySTL{ } } } + template + void list::splice(iterator position, list& x){ + this->insert(position, x.begin(), x.end()); + x.head.p = x.tail.p; + } + template + void list::splice(iterator position, list& x, iterator first, iterator last){ + if (first.p == last.p) return; + auto tailNode = last.p->prev; + if (x.head.p == first.p){ + x.head.p = last.p; + x.head.p->prev = nullptr; + }else{ + first.p->prev->next = last.p; + last.p->prev = first.p->prev; + } + if (position.p == head.p){ + first.p->prev = nullptr; + tailNode->next = head.p; + head.p->prev = tailNode; + head.p = first.p; + }else{ + position.p->prev->next = first.p; + first.p->prev = position.p->prev; + tailNode->next = position.p; + position.p->prev = tailNode; + } + } + template + void list::splice(iterator position, list& x, iterator i){ + auto next = i; + this->splice(position, x, i, ++next); + } } #endif \ No newline at end of file