算一算挤不挤
补全 load:返回负载因子(已装条数 ÷ 总格子数)。补全后输出 8 格表装 4 条时的负载因子。 (本题用 g++ -std=c++17 -O0 编译。)
挤到一定程度就换大房子
补全 maybe_grow:负载因子超过 0.75 就把容量扩成两倍,返回新容量;没超过就原样返回。4 格的表装了 4 条,补全后输出新的容量。 (本题用 g++ -std=c++17 -O0 编译。)
换了房子要重新算位置
rehash 不是把内容原样搬过去——格子数变了,每个键算出来的槽位也跟着变。补全 rehash:把 4 格表里的学号重新放进一张 8 格表。补全后输出 15 号在新表里坐第几格。 (本题用 g++ -std=c++17 -O0 编译。)
搬完之后一个都不能少
同一个 rehash。搬家最容易出的错是漏人。补全后输出新表里非空的格子有几个,和搬之前对上。 (本题用 g++ -std=c++17 -O0 编译。)
bucket_count() 返回什么
第 1 步:4 格装了 3 个:挤到 0.75 第 2 步:再装就太挤:要扩容 第 3 步:24 按 8 格重新算:第 0 格 第 4 步:17 按 8 格重新算:第 1 格 第 5 步:15 按 8 格重新算:第 7 格 24 17 15
reserve(n) 的作用
提前调用 m.reserve(n) 的好处是【0】。
结构体当键要提供什么
自己定义的结构体要当 unordered_map 的键,需要提供【0】。
reserve 之后桶够不够
运行下面这段程序: #include <iostream> #include <string> #include <utility> #include <vector> using names
默认的最大负载因子
运行下面这段程序: #include <iostream> #include <string> #include <utility> #include <vector> using names
亲眼看到一次 rehash
补全:往 unordered_map 里依次插入 1 到 1000,每插一个就看看 bucket_count() 有没有变。变过就输出 看到了,一次都没变就输出 没看到。 (本题用 g++ -std=c++17 -O0 编译。)