#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,指向下一个元素。