代码
#prlagma once
#include <iostream>
using namespace std;
template <typename T>
class MyVector {
private:
// 指向动态分配的数组
T* base;
// 容器容量
int capacity;
// 当前元素数量
int current;
public:
// 构造函数,初始化为1容量的数组
MyVector() {
base = new T[1];
capacity = 1;
current = 0;
}
// 带参构造函数,用指定的初始值和容量初始化元素
MyVector(int initCapacity, const T& initValue) {
base = new T[initCapacity];
capacity = initCapacity;
current = initCapacity;
for (int i = 0; i < initCapacity; i++) {
base[i] = initValue;
}
}
// 拷贝构造函数
MyVector(const MyVector& other) {
capacity = other.capacity;
current = other.current;
base = new T[capacity];
for (int i = 0; i < current; i++) {
base[i] = other.base[i];
}
}
// 析构函数,清理动态分配的内存
~MyVector() {
delete[] base;
base = nullptr;
}
// 向容器尾部添加元素
void push_back(T data) {
if (current == capacity) {
T* temp = new T[2 * capacity];
for (int i = 0; i < capacity; i++) {
temp[i] = base[i];
}
delete[] base;
capacity *= 2;
base = temp;
}
base[current] = data;
current++;
}
// 移除容器尾部的元素
void pop_back() {
current--;
}
// 获取当前元素个数
int size() {
return current;
}
// 获取容量
int getcapacity() {
return capacity;
}
// 返回一个指向数组首元素的指针
T* begin() {
return base;
}
// 返回一个指向数组尾后元素的指针
T* end() {
return base + current;
}
// 判断容器是否为空
bool empty() {
return current == 0;
}
// 重载下标操作符,允许使用数组下标访问方式
T& operator[](int index) {
return base[index];
}
// 重载赋值运算符
MyVector& operator=(const MyVector& other) {
if (this != &other) {
delete[] base;
capacity = other.capacity;
current = other.current;
base = new T[capacity];
for (int i = 0; i < current; i++) {
base[i] = other.base[i];
}
}
return *this;
}
};
ChatGPT解析
这个头文件定义了一个模板类 MyVector
,它是 C++ 标准库中 std::vector
容器的一个简化版实现。这个类模板允许创建可以存储任何类型(由模板参数 T
指定)元素的动态数组。下面对头文件中定义的 MyVector
类进行简单的分析。
构造函数
- 默认构造函数:初始化一个容量为 1 的动态数组,当前元素数量为 0。
- 带参构造函数:接收一个初始容量和初始值,创建一个给定容量的动态数组,并将每个元素初始化为指定的值。
- 拷贝构造函数:用另一个
MyVector
对象的内容来构造新对象,进行深复制。
析构函数
~MyVector()
:销毁对象时,释放动态分配的数组内存。
成员函数
push_back(T data)
:向数组尾部增加一个元素;如果当前元素数量等于容量,则先将容量加倍,并复制旧元素到新数组。pop_back()
:删除数组尾部的元素,当前元素数量减一。size()
:返回容器中当前元素的数量。getcapacity()
:返回容器的容量。begin()
:返回指向数组第一个元素的指针。end()
:返回指向数组尾后元素的指针(即最后一个元素的后一位置)。empty()
:判断容器是否为空,当前元素数量为 0 时返回 true。
运算符重载
operator[]
:重载子表达式运算符,用于通过下标访问数组元素。operator=
:重载赋值运算符,用于将一个MyVector
对象的所有元素(和容量信息)复制到另一个对象。
简单分析代码的功能和特性
- 这个模板类实现了自动管理内存的特性,当数组空间不足时,会自动扩容。
- 使用模板泛型编程,可以存储任意类型的数据。
- 实现了部分
std::vector
的功能,如动态数组、自动扩容、访问、修改元素等。 - 提供了对数组的基本操作,比如添加,删除,访问元素等。
- 然而,它比
std::vector
简单很多,并未包含迭代器支持、异常安全保证、容器算法兼容等特性。
注意,代码的 pop_back()
方法并没有释放内存,删除元素后,如果之后没有新元素加入,这块内存会保持占用。此外,在扩容时如果新数组分配失败,可能会造成资源泄露或数据丢失,因为旧数组已经被删除。
© 版权声明
若无特殊说明,文章版权归作者所有,请勿转载至任何平台。
THE END
暂无评论内容