From 160764ab517e2b52f47c25a145781ed21d2118ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Tue, 23 Sep 2014 08:16:57 +0800 Subject: [PATCH] improve insert efficiency --- TinySTL/Vector.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/TinySTL/Vector.h b/TinySTL/Vector.h index 7b74dc9..4e7785e 100644 --- a/TinySTL/Vector.h +++ b/TinySTL/Vector.h @@ -138,12 +138,12 @@ namespace TinySTL{ --finish_; dataAllocator::destroy(finish_); } - iterator insert(iterator position, const value_type& val); - void insert(iterator position, const size_type& n, const value_type& val); + iterator insert(const iterator& position, const value_type& val); + void insert(const iterator& position, const 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 insert(const iterator& position, InputIterator first, InputIterator last); + iterator erase(const iterator& position); + iterator erase(const iterator& first, const iterator& last); //容器的空间配置器相关 Alloc get_allocator(){ return dataAllocator; } @@ -175,12 +175,12 @@ namespace TinySTL{ allocateAndFillN(n, value); } template - void insert_aux(iterator position, InputIterator first, InputIterator last, std::false_type); + void insert_aux(const iterator& position, InputIterator first, InputIterator last, std::false_type); template - void insert_aux(iterator position, Integer n, const value_type& value, std::true_type); + void insert_aux(const iterator& position, Integer n, const value_type& value, std::true_type); template - void reallocateAndCopy(iterator position, InputIterator first, InputIterator last); - void reallocateAndFillN(iterator position, const size_type& n, const value_type& val); + void reallocateAndCopy(const iterator& position, InputIterator first, InputIterator last); + void reallocateAndFillN(const iterator& position, const size_type& n, const value_type& val); size_type getNewCapacity(size_type len)const{ size_type oldCapacity = endOfStorage_ - start_; auto res = std::max(oldCapacity, len); @@ -224,11 +224,11 @@ namespace TinySTL{ } //***************修改容器的相关操作************************** template - typename vector::iterator vector::erase(iterator position){ + typename vector::iterator vector::erase(const iterator& position){ return erase(position, position + 1); } template - typename vector::iterator vector::erase(iterator first, iterator last){ + typename vector::iterator vector::erase(const iterator& first, const iterator& last){ //尾部残留对象数 difference_type lenOfTail = end() - last; //删去的对象数目 @@ -242,7 +242,7 @@ namespace TinySTL{ } template template - void vector::reallocateAndCopy(iterator position, InputIterator first, InputIterator last){ + void vector::reallocateAndCopy(const iterator& position, InputIterator first, InputIterator last){ difference_type newCapacity = getNewCapacity(last - first); T *newStart = dataAllocator::allocate(newCapacity); @@ -257,7 +257,7 @@ namespace TinySTL{ endOfStorage_ = newEndOfStorage; } template - void vector::reallocateAndFillN(iterator position, const size_type& n, const value_type& val){ + void vector::reallocateAndFillN(const iterator& position, const size_type& n, const value_type& val){ difference_type newCapacity = getNewCapacity(n); T *newStart = dataAllocator::allocate(newCapacity); @@ -273,7 +273,7 @@ namespace TinySTL{ } template template - void vector::insert_aux(iterator position, + void vector::insert_aux(const iterator& position, InputIterator first, InputIterator last, std::false_type){ @@ -293,7 +293,7 @@ namespace TinySTL{ } template template - void vector::insert_aux(iterator position, Integer n, const value_type& value, std::true_type){ + void vector::insert_aux(const iterator& position, Integer n, const value_type& value, std::true_type){ assert(n != 0); difference_type locationLeft = endOfStorage_ - finish_; // the size of left storage difference_type locationNeed = n; @@ -312,15 +312,15 @@ namespace TinySTL{ } template template - void vector::insert(iterator position, InputIterator first, InputIterator last){ + void vector::insert(const iterator& position, InputIterator first, InputIterator last){ insert_aux(position, first, last, typename std::is_integral::type()); } template - void vector::insert(iterator position, const size_type& n, const value_type& val){ + void vector::insert(const iterator& position, const size_type& n, const value_type& val){ insert_aux(position, n, val, typename std::is_integral::type()); } template - typename vector::iterator vector::insert(iterator position, const value_type& val){ + typename vector::iterator vector::insert(const iterator& position, const value_type& val){ insert(position, 1, val); return position; }