C++实现Vector类

#ifndef _VECTOR_H_
#define _VECTOR_H_
#include <assert.h>
#include <memory.h>

#pragma warning(disable: 4715)
#pragma warning(disable: 4244)

template <typename _Type>
class VRAPI Vector{
public:
 typedef _Type* pointer;  // 数据类型指针
 class Iterator;
 friend  class Iterator;
 // 迭代器
 class VRAPI Iterator{
 public:
  Iterator() : _ptr(0) {}
  Iterator( const pointer pt ) : _ptr(pt) {}
  inline Iterator& operator=(Iterator& iter){
   _ptr = iter._ptr;
   return *this;
  }
  inline bool operator!=(Iterator& iter){
   return _ptr != iter._ptr;
  } 
  inline bool operator==(Iterator& iter){
   return _ptr == iter._ptr;
  }
  inline bool operator>(Iterator& iter){
   return _ptr > iter._ptr;
  }
  inline bool operator>=(Iterator& iter){
   return _ptr >= iter._ptr;
  }
  inline bool operator<(Iterator& iter){
   return _ptr < iter._ptr;
  }
  inline bool operator<=(Iterator& iter){
   return _ptr <= iter._ptr;
  }
  inline _Type& operator*(){
   return *_ptr;
  }
  inline Iterator& operator++(){
   _ptr++;
   return *this;
  }
  inline Iterator& operator--(){
   _ptr--;
   return *this;
  }
  inline Iterator operator++(int){
   Iterator it;
   _ptr++;
   it = *this;
   return it;
  }
  inline Iterator operator--(int){
   Iterator it;
   _ptr--;
   it = *this;
   return it;
  }
  inline Iterator& operator-=(int num){
   _ptr -= num;
   return *this;
  }
  inline Iterator& operator+=(int num){
   _ptr -= num;
   return *this;
  }
  inline Iterator operator+(int offset){
   Iterator it;
   _ptr += offset;
   it = *this;
   return it;
  }
  inline Iterator operator-(int offset){
   Iterator it;
   _ptr -= offset;
   it = *this;
   return it;
  }
  inline int operator-(Iterator& iter){
   return _ptr - iter._ptr;
  }  
  pointer _ptr;
 };


 Vector() : _first(0), _back(0), _end(0) {}

 ~Vector(){
  if( 0 != _first ){
    delete [] _first;
  }
 }
 
 void reverse( int size );          // 预留空间
 void pushback( const _Type& val ); // 从尾部添加数据
 void popback();                   // 从尾部弹出数据
 void popback( _Type& val );       // 从尾部弹出数据
 void earse( int pos, int num = 1 );      // 擦除从指定位置起的num个数据
 void earse( Iterator start, Iterator last ); // 擦除指定范围的数据
 void insert( int pos, const _Type& val );     // 在指定位置插入数据
 void clear();               // 清空数据
 _Type at( int pos );        // 从指定位置取出数据
 
 inline bool empty() const { return size() == 0; }  // 是否为空
 inline int  capacity() const { return (_end - _first) + 1; } // 容量
 inline int  size() const { return _back - _first; } // 数据的个数
 
 inline _Type operator[](int pos) { return at(pos); }
 
 // 使用说明: 在进行操作前,必须确保接受拷贝的Vector为空.
 //           Vector自己分配的空间,它自己负责释放.如果不
 //           为空的话,用户数据(指针)所指向的内存可能会
 //           因此丢失
 // 创作日期: 2005.12.22 Even
 Vector& operator=(Vector<_Type>& v)
 {
  // 如果没有此断言,可能会有严重的内存泄漏
  assert( empty() );
 
  if( _first != 0 )  // 之前有保留空间
  {
   delete [] _first;
   _first = 0;
  }
 
  int si = v.size();
  char* pt = new char[ (si+1)*sizeof(_Type) ];
  assert( pt != 0 );
  _first = (pointer)pt;
  memcpy( _first, v._first, si*sizeof(_Type) );
  _back = _first + si;
  _end = _first + si + 1;
 
  return *this;
 }
 
 // iterator
 Iterator begin() { return Iterator(_first); }  // 第一个数据开始的指示器
 Iterator end()   { return Iterator(_back); };  // 最后一个数据下一位置的指示器
 
private:
 pointer _first, _back, _end;
};

#include "Vector.hpp"

#endif //_VECTOR_H_

如果在vector中删除一个元素,整个vector会重新调整,并更新iterator,指向下一个元素。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值