完善vector迭代器的算数操作
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user