完善vector迭代器的算数操作

This commit is contained in:
邹晓航
2014-09-20 14:55:27 +08:00
parent 57971e0dfc
commit c9a1fc570d

View File

@@ -8,12 +8,14 @@
#include "UninitializedFunctions.h"
namespace TinySTL{
namespace {
template<class T>
class viter: public iterator<random_access_iterator<T, ptrdiff_t>, 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<class T>
viter<T>::viter(const viter& vit){
@@ -45,8 +52,20 @@ namespace TinySTL{
}
}
template<class T>
typename viter<T>::difference_type operator - (const viter<T>& left, const viter<T>& right){
return left - right;
viter<T> operator + (const viter<T>& vit, const typename viter<T>::difference_type i){
return vit + i;
}
template<class T>
viter<T> operator + (const typename viter<T>::difference_type i, const viter<T>& vit){
return vit + i;
}
template<class T>
viter<T> operator - (const viter<T>& vit, const typename viter<T>::difference_type i){
return vit + i;
}
template<class T>
viter<T> operator - (const typename viter<T>::difference_type i, const viter<T>& vit){
return vit + i;
}
}// end of anonymous namespace
@@ -86,11 +105,49 @@ namespace TinySTL{
iterator begin(){ return iterator(start_); }
iterator end(){ return iterator(finish_); }
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
difference_type size()const{ return finish_ - start_; }
difference_type capacity()const{ return endOfStorage_ - start_; }
bool empty()const{ return start_ == finish_; }
//<2F><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
value_type& operator[](const difference_type i){ return *(begin() + i); }
value_type& front(){ return *(begin()); }
value_type& back(){ return *(--end()); }
pointer data(){ return start_; }
//<2F>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صIJ<D8B5><C4B2><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sizeΪ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĿռ<C4BF>
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 <class InputIterator>
void insert(iterator position, InputIterator first, InputIterator last);
//TODO
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//***************<2A>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>**************************
template<class T,class Alloc>
typename vector<T, Alloc>::iterator vector<T, Alloc>::erase(iterator position){
return erase(position, position + 1);
}
template<class T, class Alloc>
typename vector<T, Alloc>::iterator vector<T, Alloc>::erase(iterator first, iterator last){
//β<><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
difference_type lenOfTail = end() - last;
//ɾȥ<C9BE>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>Ŀ
difference_type lenOfRemoved = last - first;
finish_ = finish_ - lenOfRemoved;
for (; lenOfTail != 0; --lenOfTail){
auto temp = (last - lenOfRemoved);
*temp = *(last++);
}
return viter<T>(first);
}
}
#endif