C++实现自定义Vector类:从构造到排序,全面指南
C++实现自定义Vector类:从构造到排序,全面指南
简介
本指南将引导您使用C++实现一个自定义的Vector类,该类模拟标准库中的std::vector容器的功能。您将学习如何实现各种成员函数,包括构造函数、析构函数、复制构造函数,以及用于管理Vector对象容量和大小的方法。此外,还将介绍如何添加、删除、访问元素,以及如何比较不同的Vector对象。
代码实现cpp#include
template
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 著作权归作者所有。请勿转载和采集!