简易的vector代码实现,目前实现了以下方法:
- insert
- delete
- operate[]
C++源码
#pragma once
#include <iostream>
const int DEFAULT_VECTOR_LEN = 4;
template <typename T>
class CSLVector
{
public:
CSLVector();
~CSLVector();
bool Insert(T oData);
bool Delete(int i);
int Find(T oData);
void Clear();
void Print();
T& operator[](int i);
int Size()
{
return m_iCapacity;
}
int Count()
{
return m_iCount;
}
private:
void Rellocate();
private:
T* m_pData;
int m_iCapacity;
int m_iCount;
};
template <typename T>
CSLVector<T>::CSLVector():m_pData(nullptr), m_iCapacity(DEFAULT_VECTOR_LEN), m_iCount(0)
{
}
template <typename T>
CSLVector<T>::~CSLVector()
{
Clear();
}
template <typename T>
void CSLVector<T>::Rellocate()
{
T* pTemp = (T*)malloc(m_iCapacity * sizeof(T));
memcpy(pTemp, m_pData, m_iCount * sizeof(T));
free(m_pData);
m_pData = pTemp;
}
template <typename T>
bool CSLVector<T>::Insert(T oData)
{
int i = sizeof(T);
if (m_pData == nullptr)
{
m_pData = (T*)malloc(m_iCapacity * sizeof(T));
}
if (m_iCount + 1 == m_iCapacity)
{
m_iCapacity *= 2;
Rellocate();
}
memcpy(m_pData + m_iCount, &oData, sizeof(T));
++m_iCount;
return true;
}
template <typename T>
bool CSLVector<T>::Delete(int i)
{
if (i >= m_iCount)
{
return false;
}
if (i != m_iCount - 1)
{
memcpy(m_pData + i, m_pData + i + 1, (m_iCount - i - 1) * sizeof(T));
}
--m_iCount;
if (m_iCount * 4 < m_iCapacity && m_iCapacity > DEFAULT_VECTOR_LEN)
{
m_iCapacity /= 2;
Rellocate();
}
return true;
}
template <typename T>
T& CSLVector<T>::operator[](int i)
{
T* pData = m_pData + i;
return *pData;
}
template <typename T>
void CSLVector<T>::Clear()
{
if (m_pData != nullptr)
{
free(m_pData);
m_pData = nullptr;
}
m_iCount = 0;
m_iCapacity = DEFAULT_VECTOR_LEN;
}
template <typename T>
void CSLVector<T>::Print()
{
using namespace std;
for (int i = 0; i < m_iCount; ++i)
{
cout << m_pData[i] << "\t";
}
cout << endl;
}
template <typename T>
int CSLVector<T>::Find(T oData)
{
for (int i = 0; i < m_iCount; ++i)
{
if (oData == m_pData[i])
{
return i;
}
}
return -1;
}
使用样例:
#include <iostream>
#include "vector.h"
using namespace std;
int main(int argc, char* argv[])
{
CSLVector<int> oSLVector;
cout << "*******Should print empty vector*******" <<endl;
oSLVector.Print();
int* pNumList = new int[20];
for (int i = 0; i < 20; i++)
{
pNumList[i] = i;
}
cout << "*******Insert vector*******" << endl;
for (int i = 0; i < 20; i++)
{
oSLVector.Insert(pNumList[i]);
}
oSLVector.Print();
cout << "*******Find in vector*******" << endl;
for (int i = 0; i < 40; i++)
{
int iPos = oSLVector.Find(i);
if (iPos >= 0)
{
cout << "Find [" << i <<"] success, pos ["<< iPos <<"]" << endl;
}
else
{
cout << "Find [" << i << "] failed" << endl;
}
}
cout << "*******Delete vector*******" << endl;
for (int i = 18; i >=0; --i)
{
oSLVector.Delete(i);
oSLVector.Print();
}
return 0;
}
输出: