您的位置:首页 > 编程语言 > C语言/C++

C++STL库的Vector容器简单实现的源代码参考

2015-12-14 13:55 417 查看
以前考虑到C++应届生就业可能会测试手写STL库vector容器是简单实现代码,所以精简地写了这么份代码,希望能给有需要的朋友尽点绵薄之力,求精、求顶~

#include <iostream>

#include <assert.h>

#include <Windows.h>

using namespace std;

template<class T>

class vector

{

public:

vector()

{

m_pData = nullptr;

m_uSize = 0;

}

virtual ~vector(){}

void insert( const int c_iIndex, T data )

{

int iTmpIndex = c_iIndex;

if( iTmpIndex < 0 )

{

iTmpIndex = 0;

}

if( iTmpIndex >= m_uSize )

{

iTmpIndex = m_uSize;

}

auto transform = new T[ m_uSize + 1 ];

memcpy( transform, m_pData, iTmpIndex * sizeof( T ) );

transform[ iTmpIndex ] = data;

memcpy( transform + iTmpIndex + 1, m_pData + iTmpIndex, ( m_uSize - iTmpIndex ) * sizeof( T ) );

delete []m_pData;

m_pData = transform;

m_uSize++;

}

void push_back( T data )

{

insert( m_uSize, data );

}

void push_front( T data )

{

insert( 0, data );

}

void deleteByData( T data )

{

unsigned int uCount = 0;

for( int i = 0; i < m_uSize; i++ )

{

if( m_pData[i] != data )

{

memcpy( m_pData + uCount, m_pData + i, sizeof( T ) );

uCount++;

}

}

m_uSize = uCount;

}

void deleteByIndex( const int c_iIndex )

{

if( c_iIndex < 0 || c_iIndex >= m_uSize )

{

return;

}

memcpy( m_pData + c_iIndex, m_pData + c_iIndex + 1, ( m_uSize - c_iIndex - 1 ) * sizeof( T ) );

}

T operator []( const int c_iIndex )

{

if( c_iIndex < 0 || c_iIndex >= m_uSize )

{

assert( 0 );

}

return *( m_pData + c_iIndex );

}

unsigned int size()

{

return m_uSize;

}

void print()

{

for( int i = 0; i < m_uSize; i++ )

{

cout << m_pData[i] <<endl;

}

}

private:

T* m_pData;

unsigned int m_uSize;

};

struct tmp

{

tmp( int number )

{

this->number = number;

}

int number;

};

void main()

{

vector< int > v;

v.push_back( 55 );

v.push_back( 66 );

v.push_front( 77 );

v.insert( 1, 99 );

v.push_back( 66 );

v.deleteByIndex( 0 );

v.print();

cout << v.size() <<endl;

vector< tmp* > vtmp;

vtmp.push_back( new tmp( 100 ) );

cout << vtmp[ 0 ]->number <<endl;

system( "pause" );

}

完毕,如有更精简之处,望不吝赐教。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: