c语言编程笔录

首页 >   > 笔记大全

笔记大全

C模拟实现vector代码分析

更新时间:2023-11-27

概述

vector是C++中常用的容器之一,它提供了一个动态数组的实现。本文将模拟实现vector的代码,并分析解释其功能和规范。

类的定义

vector类定义了一个动态数组,支持随机访问、尾部插入、头部插入、指定位置插入、删除和元素查找。该类的定义如下:

template<typename T>
class vector{
private:
    T* elements;        // 存储动态数组的指针
    size_t capacity;    // 当前容量
    size_t size;        // 当前大小
public:
    vector();           // 构造函数
    vector(const vector &vec);        // 拷贝构造函数
    ~vector();          // 析构函数
    T &operator[](size_t index);     // 重载下标运算符
    const T &operator[](size_t index) const; // 重载下标运算符(常量)
    vector<T> &operator=(const vector<T> &vec);        // 重载赋值运算符
    void push_back(const T &value);  // 在尾部插入元素
    void insert(const T &value, size_t index); // 在指定位置插入元素
    void erase(size_t index);   // 删除指定位置的元素
    void clear();       // 清空容器
    size_t getSize() const; // 获取容器大小
    bool empty() const;     // 容器是否为空
};

构造和析构函数

vector类的构造函数负责给成员变量elements、capacity和size赋值。在这里,我们采用的是动态分配内存的方式来实现动态数组,因此对elements进行了new操作。capacity初值为0,size初值为0。代码如下:

template<typename T>
vector<T>::vector(){
    elements = new T[0];
    capacity = 0;
    size = 0;
}

析构函数负责释放动态分配的内存。注意,在释放内存之前要将元素个数减少到0。代码如下:

template<typename T>
vector<T>::~vector(){
    clear();
    delete [] elements;
}

尾部插入和指定位置插入

尾部插入是vector容器中最常用的操作之一,在这里我们实现该操作。对于指定位置插入操作,我们采用先将末尾元素插入,再将中间元素向后移动的方式来实现。代码如下:

template<typename T>
void vector<T>::push_back(const T &value){
    if(size == capacity){   // 空间不足,进行扩容
        capacity = capacity == 0 ? 1 : capacity * 2;
        T *newElements = new T[capacity];
        for(size_t i = 0; i < size; ++i)
            newElements[i] = elements[i];
        delete [] elements;
        elements = newElements;
    }
    elements[size] = value;
    size++;
}

template<typename T>
void vector<T>::insert(const T &value, size_t index){
    if(index > size){
        throw out_of_range("Index out of range.");
        return;
    }
    if(size == capacity){   // 空间不足,进行扩容
        capacity = capacity == 0 ? 1 : capacity * 2;
        T *newElements = new T[capacity];
        for(size_t i = 0; i < index; ++i)
            newElements[i] = elements[i];
        newElements[index] = value;
        for(size_t i = index; i < size; ++i)
            newElements[i + 1] = elements[i];
        delete [] elements;
        elements = newElements;
    }
    else{                   // 空间足够,将元素插入
        for(size_t i = size; i > index; --i)
            elements[i] = elements[i - 1];
        elements[index] = value;
    }
    size++;
}

总结

在本文中,我们模拟实现了C++的vector容器,并对其代码进行了详细的分析和解释。vector类实现了动态数组的基本操作,包括尾部插入、指定位置插入、删除、元素查找等。在代码中,我们使用了动态分配内存的方式来实现动态数组,这个方法是vector的基本实现方式之一。通过本文的学习,读者可以更好地理解C++的vector容器,进一步提升自己的编程能力。

返回HTML格式的内容。