面试:stl、操作系统等查漏补缺(四)

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扩容:

  1. 触发条件
    当插入元素后,元素数量超过 负载因子(load factor) × 桶数量(bucket_count) 时触发扩容。

    • 默认负载因子为 1.0,可通过 max_load_factor(float) 调整。

  2. 扩容过程

    • 分配新的更大的桶数组(通常为原大小的两倍左右)。

    • 将所有元素重新哈希到新桶中(时间复杂度 O(N))。

  3. 优化手段

    • 提前调用 reserve(n) 预分配足够的桶,避免多次扩容。

对比:

特性 std::map(红黑树) std::unordered_map(哈希表)
底层结构 平衡二叉搜索树 桶(数组) + 链表/红黑树(解决冲突)
动态调整方式 节点动态分配,插入时调整树结构 桶数组扩容,重新哈希所有元素
时间复杂度 插入/删除/查找:O(log N) 平均 O(1),最坏 O(N)(哈希冲突严重时)
内存连续性 节点分散在堆内存中 桶数组连续存储,链表节点分散
扩容触发条件 无显式扩容,按需分配节点 元素数量超过 负载因子 × 桶数量
扩容代价 每次插入可能触发树的再平衡(局部调整) 触发全局重新哈希,代价较高

private跟protected的区别

private:访问范围限定于成员类的内部。子类无法访问父类的private成员。外部类也不能访问。实现完全封装,隐藏实现的细节。

protected:定义在该成员的类内部。所有子类都可以访问。允许子类扩展父类的功能。

特性 private protected
类内部 ✔️ ✔️
子类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值