完善vector迭代器的算数操作
This commit is contained in:
@@ -8,12 +8,14 @@
|
|||||||
#include "UninitializedFunctions.h"
|
#include "UninitializedFunctions.h"
|
||||||
|
|
||||||
namespace TinySTL{
|
namespace TinySTL{
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
template<class T>
|
template<class T>
|
||||||
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_); }
|
||||||
|
|
||||||
|
//<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><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(){
|
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);
|
||||||
|
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
//***************<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
|
#endif
|
||||||
Reference in New Issue
Block a user