C++动态数组vector类实现 - 支持自定义容量、扩容、元素访问等功能
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 著作权归作者所有。请勿转载和采集!