stl扩容:
vector相关:
vector扩容,linux下是2倍率扩容,vs是1.5倍扩容。扩容的时候,会将原先的数据区给释放掉,开辟一段新的内存区域,将所有的值复制到另一端内存当中。会造成迭代器失效的问题。1.5倍扩容机制有一个好处就是能够,复用之前释放的内存。
map与unordered_map的扩容机制:
在 C++ 中,std::map 是基于**红黑树(Red-Black Tree)**实现的关联容器,其底层数据结构与哈希表(如 std::unordered_map)不同。因此,std::map 的“扩容”机制与哈希表的扩容有本质区别。
std::map 的实现基于平衡二叉搜索树(红黑树),其特性如下:
-
动态节点分配:每个键值对作为一个树节点(
Node)动态分配在堆内存中。 -
自动平衡:插入或删除操作后,红黑树通过旋转和重新着色维持平衡,确保操作时间复杂度为 O(log N)。
-
无需显式扩容:树的节点按需分配,没有固定容量的概念,也不会像哈希表那样触发“扩容-重新哈希”的过程。
std::unordered_map扩容:
-
触发条件:
当插入元素后,元素数量超过负载因子(load factor) × 桶数量(bucket_count)时触发扩容。-
默认负载因子为
1.0,可通过max_load_factor(float)调整。
-
-
扩容过程:
-
分配新的更大的桶数组(通常为原大小的两倍左右)。
-
将所有元素重新哈希到新桶中(时间复杂度 O(N))。
-
-
优化手段:
-
提前调用
reserve(n)预分配足够的桶,避免多次扩容。
-
对比:
| 特性 | std::map(红黑树) |
std::unordered_map(哈希表) |
|---|---|---|
| 底层结构 | 平衡二叉搜索树 | 桶(数组) + 链表/红黑树(解决冲突) |
| 动态调整方式 | 节点动态分配,插入时调整树结构 | 桶数组扩容,重新哈希所有元素 |
| 时间复杂度 | 插入/删除/查找:O(log N) | 平均 O(1),最坏 O(N)(哈希冲突严重时) |
| 内存连续性 | 节点分散在堆内存中 | 桶数组连续存储,链表节点分散 |
| 扩容触发条件 | 无显式扩容,按需分配节点 | 元素数量超过 负载因子 × 桶数量 |
| 扩容代价 | 每次插入可能触发树的再平衡(局部调整) | 触发全局重新哈希,代价较高 |
private跟protected的区别
private:访问范围限定于成员类的内部。子类无法访问父类的private成员。外部类也不能访问。实现完全封装,隐藏实现的细节。
protected:定义在该成员的类内部。所有子类都可以访问。允许子类扩展父类的功能。
| 特性 | private |
protected |
|---|---|---|
| 类内部 | ✔️ | ✔️ |
| 子类 |

最低0.47元/天 解锁文章
1220

被折叠的 条评论
为什么被折叠?



