From 8e9b7b611e07463cc4ef4d7b6f0ec9fe18fd5d1e 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 11:19:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0vector=E5=AE=B9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TinySTL/Vector.h | 115 +++++++++++++++++++++++++++++++++++++++++++++++ TinySTL/main.cpp | 18 ++++---- 2 files changed, 123 insertions(+), 10 deletions(-) create mode 100644 TinySTL/Vector.h diff --git a/TinySTL/Vector.h b/TinySTL/Vector.h new file mode 100644 index 0000000..060c01a --- /dev/null +++ b/TinySTL/Vector.h @@ -0,0 +1,115 @@ +#ifndef _VECTOR_H_ +#define _VECTOR_H_ + +#include "Allocator.h" +#include "Iterator.h" +#include "UninitializedFunctions.h" + +namespace TinySTL{ + + namespace { + template + class viter: public iterator, T>{ + private: + T * ptr_; + public: + viter() :ptr_(0){} + explicit viter(T *ptr):ptr_(ptr){} + viter(const viter& vit); + viter& operator = (const viter& vit); + + T& operator *(){ return *ptr_; } + T *operator ->(){ return &(operator *()); } + + viter& operator ++(){ ++ptr_; return *this; } + viter operator ++(int){ viter temp = *this; ++(*this); return temp; } + viter& operator --(){ --ptr_; return *this; } + viter operator --(int){ viter temp = *this; --(*this); return temp; } + + 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_; } + + friend typename viter::difference_type operator - (const viter& left, const viter& right); + }; + template + viter::viter(const viter& vit){ + ptr_ = vit.ptr_; + } + template + viter& viter::operator = (const viter& vit){ + if (this != &vit){ + ptr_ = vit.ptr_; + } + } + template + typename viter::difference_type operator - (const viter& left, const viter& right){ + return left - right; + } + }// end of anonymous namespace + + template> + class vector{ + private: + T *start_; + T *finish_; + T *endOfStorage_; + + typedef Alloc dataAllocator; + //Alloc dataAllocator; + public: + typedef T value_type; + typedef viter iterator; + typedef iterator pointer; + typedef T& reference; + typedef size_t size_type; + typedef typename iterator::difference_type difference_type; + public: + //构造,复制,析构相关函数 + vector() + :start_(0), finish_(0), endOfStorage_(0){} + explicit vector(const size_type n); + vector(const size_type n, const value_type& value); + template + vector(InputIterator first, InputIterator last); + vector(const vector& v); + vector(vector&& v); + vector& operator = (const vector& v); + ~vector(){ + dataAllocator::destroy(start_, finish_); + dataAllocator::deallocate(start_, endOfStorage_ - start_); + } + + //迭代器相关 + iterator begin(){ return iterator(start_); } + iterator end(){ return iterator(finish_); } + private: + void allocateAndFillN(const size_type n, const value_type& value){ + start_ = dataAllocator::allocate(n); + uninitialized_fill_n(start_, n, value); + finish_ = endOfStorage_ = start_ + n; + } + template + void allocateAndCopy(InputIterator first, InputIterator last){ + start_ = dataAllocator::allocate(last - first); + finish_ = uninitialized_copy(first, last, start_); + endOfStorage_ = finish_; + } + }; + + template + vector::vector(const size_type n){ + allocateAndFillN(n, value_type()); + } + template + vector::vector(const size_type n, const value_type& value){ + allocateAndFillN(n, value); + } + template + template + vector::vector(InputIterator first, InputIterator last){ + allocateAndCopy(first, last); + } +} + +#endif \ No newline at end of file diff --git a/TinySTL/main.cpp b/TinySTL/main.cpp index e2a9756..cb4b453 100644 --- a/TinySTL/main.cpp +++ b/TinySTL/main.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include #include "Allocator.h" #include "Construct.h" @@ -9,16 +11,12 @@ using namespace std; int main(){ - /*for (int i = 1; i != 100000; ++i){ - auto p = TinySTL::allocator::allocate(); - - }*/ - auto p = TinySTL::allocator::allocate(100); - TinySTL::uninitialized_fill(p, p + 100, 88); - auto last = p + 100; - int array[100]; - TinySTL::uninitialized_fill_n(array, 100, 88); - for (auto n : array){ cout << n << endl; } + int array[3] = { 1, 2, 3 }; + TinySTL::vector vec(array, array + 3); + //TinySTL::vector vec(3, 1); -> error C2019 + cout << *(vec.begin()) << endl; + cout << *(++vec.begin()) << endl; + cout << *(--vec.end()) << endl; system("pause"); return 0; } \ No newline at end of file