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" );
}
完毕,如有更精简之处,望不吝赐教。。
#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" );
}
完毕,如有更精简之处,望不吝赐教。。
相关文章推荐
- C++ 文件操作(不断更新ing)
- GDI图片分割(C++)
- C++ Unicode SBCS 函数对照表
- C++贪吃蛇源代码
- 【C++】命令行Hangman #2015年12月15日 00:20:27
- C++中inline函数
- (C++)public private protected 的解释说明
- (C++)权限修饰符 public private protected的联系与区别
- 10个经典的C语言面试基础算法及代码
- C/C++小知识总结之四
- 设计模式C++实现:客户机-分配器-服务器模式
- c++中的强制转换static_cast、dynamic_cast、reinterpret_cast
- C++11 元编程 判断是否有std::hash<T>特例并提供hash函数通用实现
- 第12周项目5 迷宫问题之图深度优先遍历解法
- android如何在C++中打印调用堆栈
- 【c++】小技巧——在数组边遍历的过程中求出最值和最值的位置
- C语言字节对齐
- 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现
- 第12周项目4 利用遍历思想求解图问题
- C++ string