【C++】自定义泛型Vector类

代码

#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
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容