C++ vector如何实现动态扩容

avatar
作者
猴君
阅读量: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 方法会被调用以分配新的内存空间,并将现有元素复制到新的内存空间中。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!