From c9a1fc570d77e25eec64c68b8ffb83f9c0e40e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Sat, 20 Sep 2014 14:55:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84vector=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E5=99=A8=E7=9A=84=E7=AE=97=E6=95=B0=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TinySTL/Vector.h | 85 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/TinySTL/Vector.h b/TinySTL/Vector.h index 524bf70..646f364 100644 --- a/TinySTL/Vector.h +++ b/TinySTL/Vector.h @@ -8,12 +8,14 @@ #include "UninitializedFunctions.h" namespace TinySTL{ - + namespace { template class viter: public iterator, T>{ private: T * ptr_; + private: + T *getPtr(){ return ptr_; } public: viter() :ptr_(0){} explicit viter(T *ptr):ptr_(ptr){} @@ -30,9 +32,14 @@ namespace TinySTL{ bool operator == (const viter& vit){ return ptr_ == vit.ptr_; } bool operator != (const viter& vit){ return !(*this == vit); } - typename viter::difference_type operator - (const viter& vit){ return ptr_ - vit.ptr_; } + viter operator + (const difference_type i){ return viter(ptr_ + i); } + viter operator - (const difference_type i){ return viter(ptr_ - i); } + difference_type operator - (const viter& vit){ return (ptr_ - vit.ptr_); } - friend typename viter::difference_type operator - (const viter& left, const viter& right); + friend viter operator + (const viter& vit, const difference_type i); + friend viter operator + (const difference_type i, const viter& vit); + friend viter operator - (const viter& vit, const difference_type i); + friend viter operator - (const difference_type i, const viter& vit); }; template viter::viter(const viter& vit){ @@ -45,8 +52,20 @@ namespace TinySTL{ } } template - typename viter::difference_type operator - (const viter& left, const viter& right){ - return left - right; + viter operator + (const viter& vit, const typename viter::difference_type i){ + return vit + i; + } + template + viter operator + (const typename viter::difference_type i, const viter& vit){ + return vit + i; + } + template + viter operator - (const viter& vit, const typename viter::difference_type i){ + return vit + i; + } + template + viter operator - (const typename viter::difference_type i, const viter& vit){ + return vit + i; } }// end of anonymous namespace @@ -86,11 +105,49 @@ namespace TinySTL{ iterator begin(){ return iterator(start_); } iterator end(){ return iterator(finish_); } + //与容量相关 + difference_type size()const{ return finish_ - start_; } + difference_type capacity()const{ return endOfStorage_ - start_; } + bool empty()const{ return start_ == finish_; } + + //访问元素相关 + value_type& operator[](const difference_type i){ return *(begin() + i); } + value_type& front(){ return *(begin()); } + value_type& back(){ return *(--end()); } + pointer data(){ return start_; } + //修改容器相关的操作 + //清空容器,销毁容器中的所有对象并使容器的size为0,但不回收容器已有的空间 void clear(){ dataAllocator::destroy(start_, finish_); finish_ = start_; } + void swap(vector& v){ + if (this != &v){ + std::swap(start_, v.start_); + std::swap(finish_, v.finish_); + std::swap(endOfStorage_, v.endOfStorage_); + } + } + //TODO + void push_back(const value_type& value); + void pop_back(){ + --finish_; + dataAllocator::destroy(finish_); + } + //TODO + iterator insert(iterator position, const value_type& val); + //TODO + void insert(iterator position, size_type n, const value_type& val); + //TODO + template + void insert(iterator position, InputIterator first, InputIterator last); + //TODO + iterator erase(iterator position); + iterator erase(iterator first, iterator last); + + //容器的空间配置器相关 + Alloc get_allocator(){ return dataAllocator; } private: void allocateAndFillN(const size_type n, const value_type& value){ start_ = dataAllocator::allocate(n); @@ -146,6 +203,24 @@ namespace TinySTL{ } return *this; } + //***************修改容器的相关操作************************** + template + typename vector::iterator vector::erase(iterator position){ + return erase(position, position + 1); + } + template + typename vector::iterator vector::erase(iterator first, iterator last){ + //尾部残留对象数 + difference_type lenOfTail = end() - last; + //删去的对象数目 + difference_type lenOfRemoved = last - first; + finish_ = finish_ - lenOfRemoved; + for (; lenOfTail != 0; --lenOfTail){ + auto temp = (last - lenOfRemoved); + *temp = *(last++); + } + return viter(first); + } } #endif \ No newline at end of file