阅读量:0
在 C++ 中,std::vector
是一个动态数组,它可以根据需要自动调整大小。当向 vector
添加元素且当前容量不足以容纳新元素时,vector
会自动扩容。默认情况下,vector
的容量每次扩容时都会翻倍,但也可以通过传递自定义分配器来改变扩容策略。
要实现类似 std::vector
的动态扩容功能,可以定义一个类,并为其提供一个 reallocate
方法来管理内存分配和扩容。以下是一个简单的示例:
#include <iostream> #include <algorithm> #include <memory> template <typename T> class DynamicArray { public: DynamicArray() : data(nullptr), size(0), capacity(0) {} ~DynamicArray() { delete[] data; } void push_back(const T& value) { if (size == capacity) { reallocate(capacity == 0 ? 1 : capacity * 2); } data[size++] = value; } 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; } private: void reallocate(size_t newCapacity) { T* newData = static_cast<T*>(std::allocator<T>().allocate(newCapacity)); for (size_t i = 0; i < size; ++i) { std::allocator<T>().construct(newData + i, std::move_if_noexcept(data[i])); std::allocator<T>().destroy(data + i); } delete[] data; data = newData; capacity = newCapacity; } T* data; size_t size; size_t capacity; }; int main() { DynamicArray<int> arr; for (int i = 0; i < 10; ++i) { arr.push_back(i); } for (size_t i = 0; i < arr.getSize(); ++i) { std::cout << arr[i] << " "; } std::cout << std::endl; return 0; }
在这个示例中,我们定义了一个名为 DynamicArray
的类,它具有与 std::vector
类似的功能。当 push_back
方法被调用且当前容量不足以容纳新元素时,reallocate
方法会被调用以分配新的内存空间,并将现有元素复制到新的内存空间中。