零基础逆向工程26_C++_03_Vector

1 Vector

核心代码

#define SUCCESS              1 // 成功
#define ERROR                   -1 // 失败
#define MALLOC_ERROR            -2 // 申请内存失败
#define INDEX_ERROR           -3 // 错误的索引号


template <class T_ELE>
class Vector
{
public:
    Vector();
    Vector(DWORD dwSize);
    ~Vector();
public:
    DWORD   at(DWORD dwIndex,OUT T_ELE* pEle);  //根据给定的索引得到元素
    DWORD push_back(T_ELE Element);     //将元素存储到容器最后一个位置
    VOID    pop_back();             //删除最后一个元素
    DWORD   insert(DWORD dwIndex, T_ELE Element);   //向指定位置新增一个元素
    DWORD   capacity();     //返回在不增容的情况下,还能存储多少元素
    VOID    clear();        //清空所有元素
    BOOL    empty();        //判断Vector是否为空 返回true时为空
    VOID    erase(DWORD dwIndex);   //删除指定元素
    DWORD   size();       //返回Vector元素数量的大小
private:
    BOOL    expand();
private:
    DWORD  m_dwIndex;       //下一个可用索引
    DWORD  m_dwIncrement;   //每次增容的大小
    DWORD  m_dwLen;     //当前容器的长度
    DWORD  m_dwInitSize;    //默认初始化大小
    T_ELE *m_pVector;       //容器指针
};
template <class T_ELE>
Vector<T_ELE>::Vector() : m_dwInitSize(10),m_dwIncrement(5)
{
    //1.创建长度为m_dwInitSize个T_ELE对象
    m_pVector = new T_ELE[m_dwInitSize];
    //2.将新创建的空间初始化
    memset(m_pVector, 0, m_dwInitSize*sizeof(T_ELE);)
    //3.设置其他值
    m_dwLen = m_dwInitSize;
    m_dwIndex = 0;
}
template <class T_ELE>
Vector<T_ELE>::Vector(DWORD dwSize) : m_dwIncrement(5)
{
    //1.创建长度为dwSize个T_ELE对象
    m_pVector = new T_ELE[dwSize];
    //2.将新创建的空间初始化
    memset(m_pVector, 0, dwSize*sizeof(T_ELE));
    //3.设置其他值
    m_dwLen = dwSize;
    m_dwIndex = 0;
}   
template <class T_ELE>
Vector<T_ELE>::~Vector()
{

    //释放空间 delete[]
    delete[] m_pVector;
    m_pVector = NULL;

}

template <class T_ELE>
BOOL Vector<T_ELE>::expand()
{
    DWORD dwTempLen = 0;
    T_ELE *pTemp = NULL;
    // 1. 计算增加后的长度
    dwTempLen = m_dwLen + m_dwIncrement
    // 2. 申请空间
    pTemp = new T_ELE[dwTempLen];
    // 3. 将数据复制到新的空间
    memcpy(pTemp, m_pVector, sizeof(T_ELE)*m_dwLen);
    // 4. 释放原来空间
    delete[] m_pVector;
    m_pVector = pTemp;
    // 5. 为各种属性赋值
    m_dwLen = dwTempLen;
    return SUCCESS;
}

template <class T_ELE>
DWORD  Vector<T_ELE>::push_back(T_ELE Element)
{
    //1.判断是否需要增容,如果需要就调用增容的函数
    if (m_dwIndex >= m_dwLen)
    {
        expand();
    }
    //2.将新的元素复制到容器的最后一个位置
    memcpy(&m_pVector[m_dwIndex], &Element, sizeof(T_ELE));
    //3.修改属性值
    m_dwIndex++;
    return SUCCESS;
}

template <class T_ELE>
DWORD  Vector<T_ELE>::insert(DWORD dwIndex, T_ELE Element)
{
    //1.判断是否需要增容,如果需要就调用增容的函数
    if (dwIndex<0 || dwIndex>m_dwIndex)
    {
        return INDEX_ERROR;
    }
    //2.判断索引是否在合理区间
    if (m_dwIndex >= m_dwLen)
    {
        expand();
    }
    //3.将dwIndex只后的元素后移
    for (int i=m_dwIndex; i<dwIndex; i--)
    {
        memcpy(&m_pVector[i], &m_pVector[i-1], sizeof(T_ELE));
    }
    //4.将Element元素复制到dwIndex位置
    memcpy(&m_pVector[dwIndex], &Element, sizeof(T_ELE));
    //5.修改属性值
    m_dwIndex++;
}
template <class T_ELE>
DWORD Vector<T_ELE>::at(DWORD dwIndex,T_ELE* pEle)
{
    //判断索引是否在合理区间
    if (dwIndex<0 || dwIndex>m_dwIndex)
    {
        return INDEX_ERROR;
    }
    //将dwIndex的值复制到pEle指定的内存
    memcpy(pEle, &m_dwIndex[dwIndex], sizeof(T_ELE));

}

转载于:https://www.cnblogs.com/flatcc/p/7635937.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值