在C++中,std::vector 是一个常用的动态数组容器,它能够自动管理内存,并提供了灵活的大小调整功能。为了理解 std::vector 的内部工作机制,我们可以尝试自己实现一个简单的 Vector 类。下面,我将详细解释这个类的设计思路,并提供相应的代码示例。

1. Vector 类的基本构成

首先,我们需要定义一个名为 Vector 的类。这个类将包含以下几个核心部分:

  • 数据存储:一个指针,用于动态分配数组。
  • 当前大小和容量:两个整型变量,用于追踪当前存储的元素数量和数组的总容量。
  • 构造函数与析构函数:用于资源的分配和释放。
  • 增加元素、删除元素、访问元素等基本操作的方法。

2. 代码实现

以下是一个简单的 Vector 类的实现:

#include <iostream>
#include <stdexcept>

template<typename T>
class Vector {
private:
    T* data;       // 存储元素的动态数组
    size_t size;   // 当前元素数量
    size_t capacity; // 当前数组的容量

    void resize() {
        // 扩展容量
        capacity = capacity == 0 ? 1 : capacity * 2; // 如果容量为0则设为1,否者翻倍
        T* newData = new T[capacity]; // 创建新的数组
        for (size_t i = 0; i < size; i++) {
            newData[i] = data[i]; // 拷贝原有数据
        }
        delete[] data; // 释放旧数组的内存
        data = newData; // 更新数据指针
    }

public:
    // 构造函数
    Vector() : data(nullptr), size(0), capacity(0) {}

    // 析构函数
    ~Vector() {
        delete[] data;
    }

    // 添加元素
    void push_back(const T& value) {
        if (size == capacity) {
            resize(); // 如果满了,进行扩容
        }
        data[size++] = value; // 添加新元素
    }

    // 移除最后一个元素
    void pop_back() {
        if (size > 0) {
            size--; // 仅减少大小
        } else {
            throw std::out_of_range("Vector is empty");
        }
    }

    // 访问元素
    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
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);

    std::cout << "Vector Size: " << vec.getSize() << std::endl;
    std::cout << "Vector Capacity: " << vec.getCapacity() << std::endl;

    for (size_t i = 0; i < vec.getSize(); i++) {
        std::cout << "Element at index " << i << ": " << vec[i] << std::endl;
    }

    vec.pop_back();
    std::cout << "After popping, Vector Size: " << vec.getSize() << std::endl;

    return 0;
}

3. 代码解析

  • 动态数组的管理:通过 T* data 动态分配内存以存储元素。
  • 自动扩容:当元素数量超过当前容量时,使用 resize() 方法进行扩容,通常采用翻倍的策略。
  • 基本操作实现:提供 push_back 添加元素,pop_back 移除元素,以及重载的 operator[] 以访问元素。
  • 内存管理:在析构函数中释放动态分配的内存以避免内存泄漏。

4. 总结

通过自定义实现一个简单的 Vector 类,我们可以更好地理解 C++ 中动态内存管理和容器的基本实现原理。虽然上述代码示例并未实现所有 std::vector 的复杂功能,如拷贝构造、移动语义等,但为我们提供了基本的操作和思路。在实际开发中,建议直接使用标准库提供的 std::vector,以获得更好的性能和可靠性。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部