如果我们事先知道元素的数量而不是稍后保留它们,那么在构造函数中设置桶计数总是好的吗?
Is it always good to set the bucket count in the constructor if we know the number of elements before hand as against reserving them later?
我看到创建一个空的 unordered_map 将存储桶计数设置为默认值(在我的例子中是 11)。之后,如果我在 n 很大的地方调用 unordered_map.reserve(n)
,它会立即重新散列。因此,传递一个大数字(可能是 n 作为对 unordered_map 的构造函数的保留,以节省重新哈希)是个好主意。如果我的理解有误,请纠正我。
当然...如果您知道您将拥有多少个元素,最好也让构造函数知道。如果它没有潜在用处,构造函数就不会为它提供参数。虽然这只是一个提示,您建议的最小值,但我想所有标准库都会尊重它,可能会根据他们做出的其他 implementation/design 决定将其四舍五入到某个二次方或素数之后。平衡 creation/population 的改进速度,risk/cost 是一种维护:如果您让 "hint" 与您的实际需求不同步,您最终可能会浪费内存或失去性能(例如,负载因子太低可能意味着缓存页面命中率较低)。
我看到创建一个空的 unordered_map 将存储桶计数设置为默认值(在我的例子中是 11)。之后,如果我在 n 很大的地方调用 unordered_map.reserve(n)
,它会立即重新散列。因此,传递一个大数字(可能是 n 作为对 unordered_map 的构造函数的保留,以节省重新哈希)是个好主意。如果我的理解有误,请纠正我。
当然...如果您知道您将拥有多少个元素,最好也让构造函数知道。如果它没有潜在用处,构造函数就不会为它提供参数。虽然这只是一个提示,您建议的最小值,但我想所有标准库都会尊重它,可能会根据他们做出的其他 implementation/design 决定将其四舍五入到某个二次方或素数之后。平衡 creation/population 的改进速度,risk/cost 是一种维护:如果您让 "hint" 与您的实际需求不同步,您最终可能会浪费内存或失去性能(例如,负载因子太低可能意味着缓存页面命中率较低)。