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