C++笔记之vector的底层实现和扩容机制

这篇C++笔记探讨了vector的底层实现,详细解释了其扩容机制。当vector需要扩大容量时,通常会分配新内存,大小通常是原内存的两倍,并将旧数据拷贝到新内存中,随后释放旧内存。vector的首元素地址在扩容后会变更为新内存地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++笔记之vector的底层实现和扩容机制

1. 先申请内存空间,内存空间容量变成原来的n倍(一般是原来的两倍)
2. 将原本容器中的数据拷贝到新的内存空间中
3. 释放原来的内存空间
4. 将数组指针指向新容器的内存空间

code review!

1.vector底层如何实现的,扩容机制是怎样的?

在这里插入图片描述
文字版:
在 C++ 中,std::vector 是一个动态数组(Dynamic Array)容器,底层使用数组来存储元素。其实现采用了自动扩容机制,即在需要时动态地增加数组的大小,以适应容器中元素的增加。

下面简要描述 std::vector 的底层实现和扩容机制:

  1. 底层数组
    std::vector 内部维护一个指向动态数组的指针

当你提到vector内存扩展问题,通常是指在C++标准模板库(STL)中的`std::vector`容器,在其容量不足需要添加新元素如何动态地增加自身大小的问题。 ### Vector 内存机制 - **初始分配**:当创建一个新的 `vector` 对象,默认构造函数会初始化它,并为其预留一定量的内部存储空间。这个起始容量取决于具体的实现版本。 - **扩容规则**: - 当向 `vector` 添加超出当前已分配容量的新元素(`push_back`, `insert`)的候,就需要进行一次扩容操作了; - 容量不是简单地每次只增加一个单位来容纳新增加的那个单一元素,而是按照一定的增长因子(通常是两倍左右),一次性申请比现有数据更多一些的空间作为新的后备区,这有助于减少频繁调整数组尺寸带来的性能开销; - 扩容过程中涉及将旧有的所有内容复制到更大的连续块上,因此可能会造成短期的效率损失;然而这种策略长远来看能有效提升程序运行速度并降低碎片化程度。 ### 性能考量 由于上述特性,如果可以预估最终规模的话,则建议一开始就通过`reserve()`明确指定足够大的容量值,避免过多不必要的中间状态转换: ```cpp std::vector<int> v; v.reserve(expectedSize); // 预留预期的最大长度 ``` 这样做不仅提高了插入动作的速度,还节省了一定比例的系统资源消耗。 ### 示例代码展示自动扩容过程: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec; for (size_t i = 0; i != 10; ++i){ vec.push_back(i); std::cout << "Adding element "<< i << ", current capacity is : " << vec.capacity() << '\n'; } return 0; } ``` 此段程序会在控制台打印出随着每个整数加入而变化着的capacity信息。 #### 输出示例: ``` Adding element 0, current capacity is : 1 Adding element 1, current capacity is : 2 ... Adding element 9, current capacity is : 16 ``` 可以看到,在最初几次添加之后,容量迅速增大到了远超实际需求的数量级——这是为了后续更高效的批量加载做准备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只野生的善逸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值