C++自定义vector类实现:掌握动态数组的精髓

本篇博客将带你使用C++实现一个自定义的Vector类,该类模拟了标准库中的std::vector容器,并提供了一系列常用的功能,包括:

  • 获取容量 (capacity())* 获取大小 (size())* 判断是否为空 (empty())* 预留空间 (reserve())* 在尾部添加元素 (push_back())* 删除尾部元素 (pop_back())* 获取首元素引用 (front())* 获取尾元素引用 (back())* 通过下标访问元素 (operator[])* 安全地通过下标访问元素 (at())* 赋值运算符 (operator=())* 交换两个Vector对象的内容 (swap())* 判断两个Vector对象是否相等 (operator==())* 判断一个Vector对象是否小于另一个 (operator<())

代码示例

以下是Vector类的简化版本示例代码:cpp#include

class Vector {private: int* data; // 存储数据的数组指针 int size; // 当前存储在Vector中的元素个数 int capacity; // Vector的容量

public: // 构造函数 Vector(int initialCapacity = 10) { data = new int[initialCapacity]; size = 0; capacity = initialCapacity; }

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

// 复制构造函数    Vector(const Vector& other) {        data = new int[other.capacity];        size = other.size;        capacity = other.capacity;                for (int i = 0; i < size; i++) {            data[i] = other.data[i];        }    }

// 返回当前存储单元数    int capacity() const {        return capacity;    }

// 返回当前存储的元素个数    int size() const {        return size;    }

// 当且仅当Vector中不包含元素时返回true    bool empty() const {        return size == 0;    }

// 增大Vector的容量至n    void reserve(int n) {        if (n > capacity) {            int* newData = new int[n];                        for (int i = 0; i < size; i++) {                newData[i] = data[i];            }                        delete[] data;            data = newData;            capacity = n;        }    }

// 添加元素到尾部    void push_back(int value) {        if (size == capacity) {            reserve(capacity * 2);  // 如果容量不足,扩展为原来的两倍        }                data[size] = value;        size++;    }

// 删除尾部的元素    void pop_back() {        if (!empty()) {            size--;        }    }

// 返回指向第一个元素的引用    int& front() const {        if (!empty()) {            return data[0];        }                throw std::out_of_range('Vector is empty.');    }

// 返回指向最后一个元素的引用    int& back() const {        if (!empty()) {            return data[size - 1];        }                throw std::out_of_range('Vector is empty.');    }

// 重载下标操作符,返回下标为i的元素    int& operator[](int i) const {        return data[i];    }

// 返回下标为i的元素,检查越界    int& at(int i) const {        if (i >= 0 && i < size) {            return data[i];        }                throw std::out_of_range('Invalid index.');    }

// 重载赋值运算符    Vector& operator=(const Vector& other) {        if (this != &other) {            delete[] data;                        data = new int[other.capacity];            size = other.size;            capacity = other.capacity;                        for (int i = 0; i < size; i++) {                data[i] = other.data[i];            }        }                return *this;    }

// 交换两个Vector的内容    void swap(Vector& other) {        std::swap(data, other.data);        std::swap(size, other.size);        std::swap(capacity, other.capacity);    }

// 判断两个Vector是否相等    bool operator==(const Vector& other) const {        if (size != other.size) {            return false;        }                for (int i = 0; i < size; i++) {            if (data[i] != other.data[i]) {                return false;            }        }                return true;    }

// 判断当前Vector是否小于另一个Vector    bool operator<(const Vector& other) const {        int minSize = std::min(size, other.size);                for (int i = 0; i < minSize; i++) {            if (data[i] < other.data[i]) {                return true;            }            else if (data[i] > other.data[i]) {                return false;            }        }                return size < other.size;    }};

int main() { Vector v; v.push_back(3); v.push_back(5); Vector v2 = v; std::cout << 'v.capacity() = ' << v.capacity() << std::endl; std::cout << 'v.size() = ' << v.size() << std::endl; std::cout << 'v.empty() = ' << v.empty() << std::endl; std::cout << 'v[0] = ' << v[0] << std::endl; std::cout << 'v.at(1) = ' << v.at(1) << std::endl; return 0;}

注意

  • 以上代码仅为简化版本,实际应用中需进行更完善的错误处理和优化。* 请根据实际需求对代码进行修改和扩展。

希望本篇博客能够帮助你更好地理解和使用C++中的动态数组!


原文地址: https://www.cveoy.top/t/topic/UaW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录