链表实现的MiniVector(C++)

代码内容:利用链表实现迷你向量方法

· Minivector ·

template <typename T>
class miniVectorList
{
public:
    miniVectorList();             //初始化定义
    miniVectorList(int size);     //链表大小
    bool empty() const;           //判空
    int size() const;             //输入链表大小
    void insert(T item, int pos); //在指定位置插入
    void erase(int pos);          //指定位置删除
    friend ostream &operator<<(ostream &out, const miniVectorList &aList);

private:
    T *vArr;                        //初始化链表
    int vSize;                      //输入实际大小
    int vCapacity;                  //输入默认总大小
    void reserve(int n, bool copy); //扩大数组空间
};
template <typename T>
void miniVectorList<T>::reserve(int n, bool copy)
{
    int *newArr; //定义数组
    int i;
    newArr = new int[n]; //新建整型数组空间
    if (newArr == NULL)  //建立失败抛出错误
        throw memoryAllocationError(
            "miniVector reserve(): memory allocation  			failure");
    if (copy) //如果原数组不是空的则将原数组传入新建的数组
        for (i = 0; i < vSize; i++)
            newArr[i] = vArr[i];
    if (vArr != NULL)
        delete[] vArr; //传递完毕后删除原数组
    vArr = newArr;     //把新空间给原来的空间
    vCapacity = n;     //主要就是这一步,扩大了默认总空间大小
}
template <typename T>
miniVectorList<T>::miniVectorList() //初始化列表
{}

== == == == == == == == == == == == == == == == == == == == == == == == ==
template <typename T>
miniVectorList<T>::miniVectorList(int size) : vSize(0),
vCapacity(0), vArr(NULL) //输入链表大小,初始化实际大小为0,真实大小为0,数组vArr为空
{
    int i;
    if (size == 0)
        return;           //如果大小为0直接结束
    reserve(size, false); //因为大小已经为0然后用这一步建立大小为1的空间
    vSize = size;         //实际大小等于真实大小
    for (i = 0; i < vSize; i++)
    {
        vArr[i] = 0; //初始化所有的数组元素为0
    }
}

template <typename T>
bool miniVectorList<T>::empty() const //判空,如果默认大小为0为false
{
    return vSize == 0;
}

template <typename T>
int miniVectorList<T>::size() const //读取出实际大小
{
    return vSize;
}

template <typename T>
ostream &operator<<(ostream &out, const miniVectorList<T> &aList) //重载
{
    for (int i = 0; i < aList.vSize; i++)
        out << aList.vArr[i] << "  ";
    return out;
}
template <typename T>
void miniVectorList<T>::erase(int pos) //删除指定位置元素
{
    if (vSize == 0)
    {
        cerr << "*** List is empty ***\n";
        return;
    } //判空

    if (pos < 0 || pos >= vCapacity) //位置判断是否正确,抛错
    {
        cerr << "Illegal location to delete -- " << pos
             << ".  List unchanged. ***\n";
        return;
    }

    for (int i = pos; i < mySize; i++) //从删除位置处后边向前提前一位
        vArray[i] = vArray[i + 1];
    vSize--; //实际大小减小
}
template <typename T>
void miniVectorList<T>::insert(T item, int pos) //指定位置插入
{
    if (vSize == vCapacity) //数组空间已满抛出错误
    {
        cerr << "*** No space for list element -- terminating "
                "execution ***\n";
        exit(1);
    }
    if (pos < 0 || pos > vCapacity) //位置错误抛错{
        cerr << "*** Illegal location to insert -- " << pos
             << ".  List unchanged. ***\n";
    return;
}
for (int i = mySize; i > pos; i--) //把pos位置空出来
    vArray[i] = vArray[i - 1];
vArray[pos] = item;
vSize++; //空间增大
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章