C++模拟实现vector
发布人:shili8
发布时间:2025-02-03 17:00
阅读次数:0
**C++模拟实现Vector**
在C++中,`std::vector`是最常用的容器类之一,它提供了动态数组的功能。然而,在某些情况下,我们可能需要自己实现一个类似于`std::vector`的数据结构。在本文中,我们将尝试模拟实现一个简单的`Vector`类,支持基本的操作,如插入、删除和访问元素。
### Vector类定义
cppclass Vector { private: int capacity; // 容器的最大容量 int size_; // 当前容器中元素的数量 int* data; // 存储元素的数组指针public: Vector(int initialCapacity =10); // 构造函数,指定初始容量 ~Vector(); // 析构函数,释放内存 void push_back(const int& value); // 在末尾添加新元素 void insert(int index, const int& value); // 插入新元素到指定位置 void erase(int index); // 删除指定位置的元素 int at(int index) const; // 返回指定位置的元素 int getSize() const; // 获取当前容器中元素的数量};
### 构造函数和析构函数
cppVector::Vector(int initialCapacity) : capacity(initialCapacity), size_(0), data(new int[initialCapacity]) {} Vector::~Vector() { delete[] data; }
在构造函数中,我们使用`new`来分配一个初始容量的数组,并将其地址赋给`data`指针。在析构函数中,我们使用`delete[]`释放该数组所占用的内存。
### push_back()函数
cppvoid Vector::push_back(const int& value) { if (size_ == capacity) { // 如果当前容器已满 capacity *=2; // 将容量增加一倍 int* newData = new int[capacity]; // 分配新的数组 for (int i =0; i < size_; ++i) { newData[i] = data[i]; // 复制旧数据到新数组 } delete[] data; //释放旧数组 data = newData; // 更新data指针 } data[size_++] = value; // 在末尾添加新元素}
在`push_back()`函数中,我们首先检查当前容器是否已满。如果是,则将容量增加一倍,并分配一个新的数组。然后,我们复制旧数据到新数组,释放旧数组,并更新`data`指针。在最后一步中,我们直接添加新元素到末尾。
### insert()函数
cppvoid Vector::insert(int index, const int& value) { if (index < 0 || index > size_) { // 如果索引无效 throw std::out_of_range("Index out of range"); // 抛出异常 } if (size_ == capacity) { // 如果当前容器已满 capacity *=2; // 将容量增加一倍 int* newData = new int[capacity]; // 分配新的数组 for (int i = size_; i > index; --i) { newData[i] = data[i -1]; // 移动旧数据到新数组 } delete[] data; //释放旧数组 data = newData; // 更新data指针 } for (int i = size_; i > index; --i) { data[i] = data[i -1]; // 移动旧数据到新位置 } data[index] = value; // 插入新元素 ++size_; // 更新容器大小}
在`insert()`函数中,我们首先检查索引是否有效。如果是,则将容量增加一倍,并分配一个新的数组。然后,我们移动旧数据到新位置,插入新元素。在最后一步中,我们更新容器大小。
### erase()函数
cppvoid Vector::erase(int index) { if (index < 0 || index >= size_) { // 如果索引无效 throw std::out_of_range("Index out of range"); // 抛出异常 } for (int i = index; i < size_ -1; ++i) { data[i] = data[i +1]; // 移动旧数据到新位置 } --size_; // 更新容器大小}
在`erase()`函数中,我们首先检查索引是否有效。如果是,则移动旧数据到新位置,更新容器大小。
### at()函数
cppint Vector::at(int index) const { if (index < 0 || index >= size_) { // 如果索引无效 throw std::out_of_range("Index out of range"); // 抛出异常 } return data[index]; // 返回指定位置的元素}
在`at()`函数中,我们首先检查索引是否有效。如果是,则返回指定位置的元素。
### getSize()函数
cppint Vector::getSize() const { return size_; // 返回当前容器中元素的数量}
在`getSize()`函数中,我们直接返回当前容器中元素的数量。
以上就是我们对Vector类的模拟实现。这个类支持基本的操作,如插入、删除和访问元素,并提供了一个简单的动态数组功能。