c/c++ vector 的简单实现

说其简单,是因为没有实现allocate 类, 而采用简单的malloc 分配内存。

iterator 也采用直接的value_type 指针, 但保留了vector 的基本接口和方法。对理解vector 工作原理有帮助。

代码及测试代码如下:

#include "stdafx.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 ]; }

	////////////////////////////////////////////////////////////////////////////////
	//插入元素, 弹出元素
	////////////////////////////////////////////////////////////////////////////////
	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分配的资源

	////////////////////////////////////////////////////////////////////////////////
	// 内存分配(分配器简化处理)
	////////////////////////////////////////////////////////////////////////////////
	//每次空间不够的时候,就重新获得2倍于当前容量的空间
	void resize( int newSize ){
		if( newSize > m_capacity )
			ReAllocate( newSize*2 ); 
		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;
		delete [] oldArray;
	}
};



int main(int argc, char *argv[])
{
	vector v;
	v.push_back(4);
	v.push_back(5);
	vector::iterator it;
	for(it=v.begin(); it!=v.end(); it++)
	{
		printf("data is %d\n",*it);
	}
	_getch();
	return 0;
}



你可能感兴趣的:(c++,编程,vector,iterator,delete,class,null,测试)