说其简单,是因为没有实现allocate 类, 而采用简单的malloc 分配内存。
iterator 也采用直接的value_type 指针, 但保留了vector 的基本接口和方法。对理解vector 工作原理有帮助。
代码及测试代码如下:
//#include "stdafx.h"
#include <stdio.h>
template < class _T >
class vector{
enum{ SPACE_CAPACITY = 4 };//初始容量
public:
// 构造器与析构器
//用explicit避免隐式类型转换
explicit vector( int size = 0 ):
m_size( size ),m_capacity( size + SPACE_CAPACITY ){
_p = new _T[ m_capacity ];
}
//copy constructor
vector( const vector & rhs ):_p( NULL ){ operator=( rhs ); }
~vector(){ delete [] _p; }
//运算符
const vector & operator= ( const vector & rhs ){
if( this != &rhs ){//如果是本身的话就不用再操作了
delete [] _p;
m_size = rhs.size();
m_capacity = rhs.capacity();
_p = new _T[ capacity() ];
for( int k = 0; k < m_size; k++ )//拷贝元素
_p[k] = rhs._p[k];
}
return *this;
}
_T & operator[] ( int index ) { return _p[ index ]; }
const _T & operator[] ( int index ) const { return _p[ index ]; }
// 指针, iterator 操作
typedef _T * iterator;//用原生指针替代迭代器
typedef const _T * const_iterator;
iterator begin() { return &_p[0]; }
const_iterator begin() const { return &_p[0]; }
iterator end() { return &_p[ m_size ]; }
const_iterator end() const { return &_p[ m_size ]; }
//插入元素, 弹出元素
//每次空间不够的时候,就重新获得2倍于当前容量的空间
void push_back( const _T & x ){
if( m_size == m_capacity )
ReAllocate( 2*m_capacity + 1 );
_p[ m_size++ ] = x;
}
void pop_back() { m_size--; }
// 属性接口
int size() const { return m_size; }
int capacity() const { return m_capacity; }
bool empty() const { return size() == 0; }
const _T & back() const { return _p[ m_size-1 ]; }
private:
int m_size; //元素的个数
int m_capacity; //容量
_T *_p; //指向new分配的资源
// 内存分配(分配器简化处理)
void resize( int newSize ){
if( newSize > m_capacity )
ReAllocate( newSize );
m_size = newSize;
}
//获取新的空间,拷贝,释放旧的数据
void ReAllocate( int newCapacity ){
if( newCapacity < m_size ) return;
_T *oldArray = _p;
_p = new _T[ newCapacity ];
for( int k = 0; k < m_size; k++ )
_p[k] = oldArray[k];
m_capacity = newCapacity; //m_size 没有改变
delete [] oldArray;
}
};
int main()
{
vector<int> v;
v.push_back(4);
v.push_back(5);
vector<int>::iterator it;
for(it=v.begin(); it!=v.end(); it++)
{
printf("data is %d\n",*it);
}
// _getch();
return 0;
}