C++:模拟实现 Vector
引言
在 C++ 中,std::vector
是一个动态数组,提供了高效的内存管理和灵活的元素访问。本文将模拟实现一个简单的 Vector
类,以帮助理解其底层实现原理。
我们的 Vector
类将实现以下基本功能:
- 动态内存分配和释放
- 添加元素
- 删除元素
- 访问元素
- 获取当前大小和容量
代码实现
以下是一个简单的 Vector
类的实现:
#include <iostream>
#include <stdexcept>
template <typename T>
class Vector {
private:
T* data; // 指向数据的指针
size_t size; // 当前元素个数
size_t capacity; // 当前容量
void resize(size_t new_capacity) {
T* new_data = new T[new_capacity]; // 分配新内存
for (size_t i = 0; i < size; ++i) {
new_data[i] = data[i]; // 复制原数据
}
delete[] data; // 释放旧内存
data = new_data; // 更新指针
capacity = new_capacity; // 更新容量
}
public:
// 构造函数
Vector() : size(0), capacity(1) {
data = new T[capacity]; // 初始化容量为1
}
// 析构函数
~Vector() {
delete[] data; // 释放内存
}
// 添加元素
void push_back(const T& value) {
if (size == capacity) {
resize(capacity * 2); // 容量不足时扩展
}
data[size++] = value; // 添加元素
}
// 删除最后一个元素
void pop_back() {
if (size == 0) {
throw std::out_of_range("Vector is empty");
}
--size; // 减少大小
}
// 访问元素
T& operator[](size_t index) {
if (index >= size) {
throw std::out_of_range("Index out of range");
}
return data[index]; // 返回元素引用
}
// 获取当前大小
size_t getSize() const {
return size;
}
// 获取当前容量
size_t getCapacity() const {
return capacity;
}
};
int main() {
Vector<int> vec; // 创建一个整数类型的 Vector
// 添加元素
for (int i = 0; i < 10; ++i) {
vec.push_back(i);
std::cout << "Added: " << i << ", Size: " << vec.getSize() << ", Capacity: " << vec.getCapacity() << std::endl;
}
// 访问元素
for (size_t i = 0; i < vec.getSize(); ++i) {
std::cout << "Element at index " << i << ": " << vec[i] << std::endl;
}
// 删除元素
for (int i = 0; i < 5; ++i) {
vec.pop_back();
std::cout << "Popped an element, New Size: " << vec.getSize() << std::endl;
}
return 0;
}
代码详解
1. 成员变量
T* data
: 指向动态分配内存的指针,用于存储元素。size_t size
: 当前元素的个数。size_t capacity
: 当前分配的内存容量。
2. 构造函数和析构函数
- 构造函数:初始化
size
为 0,capacity
为 1,并分配相应的内存。 - 析构函数:释放分配的内存,避免内存泄漏。
3. push_back
方法
- 当
size
达到capacity
时,调用resize
方法将容量翻倍。 - 添加新元素并增加
size
。
4. pop_back
方法
- 减少
size
,删除最后一个元素。
5. 访问元素
- 重载
operator[]
,允许通过索引访问元素,并检查索引的有效性。
6. getSize
和 getCapacity
方法
- 提供获取当前大小和容量的方法。
运行结果
运行上述代码将输出添加元素、访问元素和删除元素的详细信息,展示了 Vector
类的基本功能。
总结
通过以上实现,我们模拟了 C++ 中 std::vector
的基本功能。这个简单的实现帮助我们理解动态数组的内存管理和元素操作。希望这篇文章能帮助你更好地理解 C++ 中的容器类。