legongju.com
我们一直在努力
2024-12-26 23:53 | 星期四

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

在 C++ 中,std::vector 是一个动态数组,它可以根据需要自动调整大小。当向 vector 添加元素且当前容量不足以容纳新元素时,vector 会自动扩容。默认情况下,vector 的容量每次扩容时都会翻倍,但也可以通过传递自定义分配器来改变扩容策略。

要实现类似 std::vector 的动态扩容功能,可以定义一个类,并为其提供一个 reallocate 方法来管理内存分配和扩容。以下是一个简单的示例:

#include 
#include 
#include 

template 
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 = https://www.yisu.com/ask/static_cast(std::allocator().allocate(newCapacity));
        for (size_t i = 0; i < size; ++i) {
            std::allocator().construct(newData + i, std::move_if_noexcept(data[i]));
            std::allocator().destroy(data + i);
        }
        delete[] data;
        data = https://www.yisu.com/ask/newData;"hljs">int main() {
    DynamicArray 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 方法会被调用以分配新的内存空间,并将现有元素复制到新的内存空间中。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/62312.html

相关推荐

  • C++ PriorityQueue 的内存管理策略是什么

    C++ PriorityQueue 的内存管理策略是什么

    C++ STL(Standard Template Library)中的PriorityQueue是一个容器适配器,它提供了优先队列的数据结构。优先队列中的元素按照特定的顺序进行排列:总是优先取出...

  • C++ PriorityQueue 如何保证元素唯一性

    C++ PriorityQueue 如何保证元素唯一性

    在 C++ 标准库中,priority_queue 并不直接提供保证元素唯一性的功能。priority_queue 是一种特殊的队列,其中元素按照优先级进行排序,而不是按照插入顺序。默认...

  • C++ PriorityQueue 在多线程下如何使用

    C++ PriorityQueue 在多线程下如何使用

    在 C++ 中,priority_queue 并不是线程安全的。如果你想在多线程环境中使用它,你需要自己提供线程安全机制。
    一种常见的方法是使用互斥锁(mutex)来保护对...

  • C++ PriorityQueue 能否自定义比较函数

    C++ PriorityQueue 能否自定义比较函数

    是的,C++的PriorityQueue允许你自定义比较函数。你可以通过传递一个自定义的比较对象(也称为仿函数)给PriorityQueue的构造函数来实现这一点。这个比较对象需要...

  • preferenceactivity在不同版本的Android系统中表现如何

    preferenceactivity在不同版本的Android系统中表现如何

    PreferenceActivity 是 Android 开发中用于创建设置界面的一个基类,它允许开发者通过定义 XML 文件来组织设置项,从而简化了设置界面的开发过程。以下是关于Pre...

  • 如何在preferenceactivity中实现复杂的设置逻辑

    如何在preferenceactivity中实现复杂的设置逻辑

    在PreferenceActivity中实现复杂的设置逻辑,可以通过以下步骤来完成: 创建PreferenceScreen和Preference:
    使用XML布局文件定义PreferenceScreen和各个Pr...

  • preferenceactivity的性能优化有哪些方法

    preferenceactivity的性能优化有哪些方法

    PreferenceActivity的性能优化主要包括以下几个方面: 减少启动时间:可以通过减少在onCreate()中执行的耗时操作来优化启动时间。例如,避免在onCreate()中加载大...

  • 在preferenceactivity中如何添加自定义设置项

    在preferenceactivity中如何添加自定义设置项

    在PreferenceActivity中添加自定义设置项,你需要遵循以下步骤: 创建一个新的XML文件,用于定义你的设置项。这个文件应该位于res/xml/目录下。例如,你可以创建...