C++实现自定义Vector类:从构造到排序,全面指南

简介

本指南将引导您使用C++实现一个自定义的Vector类,该类模拟标准库中的std::vector容器的功能。您将学习如何实现各种成员函数,包括构造函数、析构函数、复制构造函数,以及用于管理Vector对象容量和大小的方法。此外,还将介绍如何添加、删除、访问元素,以及如何比较不同的Vector对象。

代码实现cpp#include

templateclass Vector {private: T *data; // 存储数据的指针 int capacity; // 存储单元数 int size; // 当前元素个数

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

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

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

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

// 返回当前存储在v中值的个数    int getSize() const {        return size;    }

// 当且仅当v中不包含值时返回true    bool isEmpty() const {        return size == 0;    }

// 增大v使得容量为n    void reserve(int n) {        if (n <= capacity) {            return;        }

    T *newData = new T[n];        for (int i = 0; i < size; i++) {            newData[i] = data[i];        }

    delete[] data;        data = newData;        capacity = n;    }

// 添加value到尾部    void push_back(const T& value) {        if (size == capacity) {            reserve(capacity == 0 ? 1 : capacity * 2);        }

    data[size] = value;        size++;    }

// 删除v的最后一个元素    void pop_back() {        if (size > 0) {            size--;        }    }

// 返回指向v的第一个元素的引用    T& front() {        return data[0];    }

// 返回指向v的最后一个元素的引用    T& back() {        return data[size - 1];    }

// 返回v中下标为i的元素-不检查越界    T& operator[](int i) {        return data[i];    }

// 返回v中下标为i的元素-检查越界    T& at(int i) {        if (i < 0 || i >= size) {            throw std::out_of_range('Index out of range');        }        return data[i];    }

// 将v2的拷贝赋予v1    Vector& operator=(const Vector& other) {        if (this != &other) {            delete[] data;            data = nullptr;            capacity = 0;            size = 0;

        reserve(other.capacity);            for (int i = 0; i < other.size; i++) {                push_back(other.data[i]);            }        }        return *this;    }

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

// 当v1和v2值相同,值的顺序相同返回true否则为false    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;    }

// 当且仅当v1在字典顺序上小于v2时才返回true    bool operator<(const Vector& other) const {        int minLength = std::min(size, other.size);        for (int i = 0; i < minLength; i++) {            if (data[i] < other.data[i]) {                return true;            } else if (data[i] > other.data[i]) {                return false;            }        }        return size < other.size;    }};

使用示例cppint main() { Vector v; v.reserve(10); v.push_back(1); v.push_back(2); v.push_back(3);

std::cout << 'v.capacity(): ' << v.getCapacity() << std::endl;    std::cout << 'v.size(): ' << v.getSize() << std::endl;    std::cout << 'v.empty(): ' << (v.isEmpty() ? 'true' : 'false') << std::endl;    std::cout << 'v.front(): ' << v.front() << std::endl;    std::cout << 'v.back(): ' << v.back() << std::endl;    std::cout << 'v[1]: ' << v[1] << std::endl;    std::cout << 'v.at(2): ' << v.at(2) << std::endl;

Vector<int> v2 = v;    std::cout << 'v2.capacity(): ' << v2.getCapacity() << std::endl;    std::cout << 'v2.size(): ' << v2.getSize() << std::endl;

Vector<int> v3;    v3.push_back(3);    v3.push_back(2);    v3.push_back(1);    std::cout << 'v == v2: ' << (v == v2 ? 'true' : 'false') << std::endl;    std::cout << 'v < v3: ' << (v < v3 ? 'true' : 'false') << std::endl;

v2.swap(v3);    std::cout << 'v2[0]: ' << v2[0] << std::endl;    std::cout << 'v3[0]: ' << v3[0] << std::endl;

return 0;}

总结

本指南介绍了如何使用C++实现自定义的Vector类,涵盖了从基本构造到复杂操作的全面功能。通过学习本指南,您将更深入地了解数据结构和算法,并能够在实际项目中运用这些知识。请注意,这只是一个简单的示例实现,可能不包含所有边界情况和错误处理。在实际使用中,您可能需要进一步完善该类。


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

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