unordered_set扩容策略

本文详细解释了C++中unordered_set和unordered_map的数据结构在初始化和增长时的扩容策略,重点讨论了它们在达到特定阈值时如何从8倍到2倍的扩容变化。

这里写自定义目录标题

#include <iostream>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<algorithm>
#include<unordered_set>
#include<limits>
#include<limits.h>
using namespace std;

int main() {
    unordered_set<int> _set;
    int n = 100;
    for (int i = 0; i < n; ++i) {
        _set.insert(i);
        if (i % 4 == 0) {
            cout << "insert: " << i << " ==== " << _set.bucket_count() << endl;
        }
    }
}

在这里插入图片描述
可以看到unordered_set初始时是以8倍进行扩容的。
在这里插入图片描述
而在unordered_set大于等于512时,是以2倍进行扩容的。

unordered_map扩容策略与unordered一致。

动态扩容数组通常在堆上分配内存,而堆栈溢出一般指的是栈溢出。栈溢出通常是由于栈空间耗尽导致的,而动态扩容数组本身一般不会直接导致栈溢出,因为它主要在堆上管理内存。不过,如果动态扩容数组的操作间接影响到栈,比如递归调用层次过深或者局部变量过大,就可能引发栈溢出。 #### 栈空间限制 栈空间的大小是有限的,通常在不同的操作系统和编译器中有不同的默认值。例如,在 Linux 系统中,栈的默认大小可能是 8MB。当程序使用的栈空间超过这个限制时,就会发生栈溢出。 #### 动态扩容数组引发栈溢出的情况 1. **递归调用**:如果在动态扩容数组的操作中使用了递归,并且递归深度过大,会不断向栈中压入栈帧,最终导致栈溢出。例如,以下代码展示了一个递归调用的动态扩容数组示例: ```python def recursive_expand_array(arr, depth): if depth == 0: return arr new_arr = arr + [0] * len(arr) return recursive_expand_array(new_arr, depth - 1) try: initial_array = [1] result = recursive_expand_array(initial_array, 100000) except RecursionError: print("Stack overflow due to deep recursion!") ``` 2. **局部变量过大**:如果在函数内部定义了一个非常大的动态扩容数组作为局部变量,栈空间可能无法容纳,从而导致栈溢出。例如: ```python def large_local_array(): large_array = [0] * (1024 * 1024 * 10) # 尝试分配 10MB 的数组 return large_array try: large_local_array() except MemoryError: print("Stack overflow due to large local array!") ``` #### 具体大小情况 栈溢出与动态扩容数组的具体大小并没有直接的线性关系,而是与栈空间的使用情况有关。一般来说,当递归调用的深度超过系统栈的最大深度,或者局部变量占用的栈空间超过栈的剩余空间时,就会发生栈溢出。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值