c/c++ vector 的简单实现

来源:互联网 发布:金税软件注册 编辑:程序博客网 时间:2024/05/21 06:48

说其简单,是因为没有实现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 constructorvector( 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<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;}