完善vector迭代器的算数操作
This commit is contained in:
@@ -14,6 +14,8 @@ namespace TinySTL{
|
|||||||
class viter: public iterator<random_access_iterator<T, ptrdiff_t>, T>{
|
class viter: public iterator<random_access_iterator<T, ptrdiff_t>, T>{
|
||||||
private:
|
private:
|
||||||
T * ptr_;
|
T * ptr_;
|
||||||
|
private:
|
||||||
|
T *getPtr(){ return ptr_; }
|
||||||
public:
|
public:
|
||||||
viter() :ptr_(0){}
|
viter() :ptr_(0){}
|
||||||
explicit viter(T *ptr):ptr_(ptr){}
|
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 ptr_ == vit.ptr_; }
|
||||||
bool operator != (const viter& vit){ return !(*this == vit); }
|
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>
|
template<class T>
|
||||||
viter<T>::viter(const viter& vit){
|
viter<T>::viter(const viter& vit){
|
||||||
@@ -45,8 +52,20 @@ namespace TinySTL{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
template<class T>
|
template<class T>
|
||||||
typename viter<T>::difference_type operator - (const viter<T>& left, const viter<T>& right){
|
viter<T> operator + (const viter<T>& vit, const typename viter<T>::difference_type i){
|
||||||
return left - right;
|
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
|
}// end of anonymous namespace
|
||||||
|
|
||||||
@@ -86,11 +105,49 @@ namespace TinySTL{
|
|||||||
iterator begin(){ return iterator(start_); }
|
iterator begin(){ return iterator(start_); }
|
||||||
iterator end(){ return iterator(finish_); }
|
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(){
|
void clear(){
|
||||||
dataAllocator::destroy(start_, finish_);
|
dataAllocator::destroy(start_, finish_);
|
||||||
finish_ = start_;
|
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);
|
||||||
|
|
||||||
|
//容器的空间配置器相关
|
||||||
|
Alloc get_allocator(){ return dataAllocator; }
|
||||||
private:
|
private:
|
||||||
void allocateAndFillN(const size_type n, const value_type& value){
|
void allocateAndFillN(const size_type n, const value_type& value){
|
||||||
start_ = dataAllocator::allocate(n);
|
start_ = dataAllocator::allocate(n);
|
||||||
@@ -146,6 +203,24 @@ namespace TinySTL{
|
|||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
//***************修改容器的相关操作**************************
|
||||||
|
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){
|
||||||
|
//尾部残留对象数
|
||||||
|
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<T>(first);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in New Issue
Block a user