vector類介面實現
阿新 • • 發佈:2018-12-05
namespace VECTOR { template<class T> class vector { public: typedef T* Iterator; typedef const T* ConstIterator; Iterator begin() { return _start; } Iterator end() { return _finish; } ConstIterator cbegin() const { return _start; } ConstIterator cend() const { return _finish; } size_t size() const { return _finish - _start; } size_t capacity() const { return _endofstorage - _start; } vector() : _start(nullptr) , _finish(nullptr) ,_endofstorage(nullptr) {} vector(int n, const T& value = T()) : _start(nullptr) , _finish(nullptr) ,_endofstorage(nullptr) { reserve(n); while(n--) { push_back(value) } } ~vector() { delete[] _start; _start = _finish = _endofstorage = nullptr; } template<class InputIterator> vector(InputIterator first, InputIterator last) { reserve(last - first); while(first++ < last) { push_back(*first); } } vector(const vector<T>& v) : _start(nullptr) , _finish(nullptr) , _endofstorage(nullptr) { reserve(v.capacity()); Iterator it = begin(); ConstIterator cit = v.cbegin(); while(cit != cbegin) { *it++ = *cit++; } _finish = _start + v.size(); _endofstorage = _start + v.capacity(); } public: void reseve(size_t n) { if(n > capacity) { size_t lsize = size(); T* tmp = new T(n); if(_start) { for(size_t i = 0; i < lsize; ++i) tmp[i] = _start[i]; } _start = tmp; _finish = _start + tmp; _endofstorage = _start + n; } } void swap(vector<T>& v) { swap(_start, v._start); swap(_finish, v._finish); sawp(_endofstorage, v._endofstorage); } void push_back(const T& x) { insert(_end, x); } void pop_back() { erase(_end); } Iterator insert(Iterator pos, const T& x) { assert(pos <= _finish && pos >= _start); if(finish == _endofstorage) { size_t lsize = size(); size_t newcapacity = capacity() == 0 ? 1 : capacity() * 2; reserve(newcapcity); //增容之後要重置pos pos = _start + lsize; } Iterator end = _finish - 1; while(end >= pos) { *(end+1) = *end; --end; } *pos = x; ++_finish; return pos; } Iterator erase(Iterator pos) { assert(pos <= _finish && pos >= _start); Iterator begin = pos + 1; while(begin != pos+1) { *(begin-1) = *begin; ++*begin; } --_finish; return pos; } private: iterator _start; iterator _finish; iterator _endofstorage; }; }