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格式的内容。