预测std :: unordered_set或std :: unordered_map的调整大小/重新调整
Predict resize/rehash of std::unordered_set or std::unordered_map
是否可以可靠地预测何时插入到std :: unordered_set或std :: unordered_map将调整基础存储大小并重新进行项目?
?我的程序维护不断增长的项目的unordered_set,但是有些项目可能会变为"过期",我可以从集合中删除这些项目以节省空间。一个好时机是在插入物品之前,如果插入物会导致集合进行调整大小并重新升级。无论如何,该集合需要扫描其所有元素,我甚至可以防止其调整大小)。
,但到目前为止,我还没有找到一种预测标准库实现的调整大小的方法。下面的代码公开了Microsoft的实现与LIBSTDC 之间的差异。
std::unordered_set<int> set;
for (int i=0; i < 1000; ++i) {
size_t bucketsBefore = set.bucket_count();
set.emplace(i);
size_t bucketsAfter = set.bucket_count();
bool resized = bucketsAfter > bucketsBefore;
if (resized)
printf("Size from %zu to %zu, buckets from %zu to %zu.n", set.size() - 1, set.size(), bucketsBefore, bucketsAfter);
}
在Windows中使用MSVC编译时,此打印
Size from 8 to 9, buckets from 8 to 64.
Size from 64 to 65, buckets from 64 to 512.
Size from 512 to 513, buckets from 512 to 1024.
在Linux中使用G 编译时,此打印
Size from 0 to 1, buckets from 1 to 3.
Size from 2 to 3, buckets from 3 to 7.
Size from 6 to 7, buckets from 7 to 17.
Size from 16 to 17, buckets from 17 to 37.
Size from 36 to 37, buckets from 37 to 79.
Size from 78 to 79, buckets from 79 to 167.
Size from 166 to 167, buckets from 167 to 337.
Size from 336 to 337, buckets from 337 to 709.
Size from 708 to 709, buckets from 709 to 1493.
在负载因子方面,这意味着Microsoft实现将在负载因子超过1时调整集合大小,但是LIBSTDC - 当负载因子达到1。
时现在,我想知道什么是一个好方法。有选项。
- 调整大小后卸下过期的物品。更强大的选择,但是这样,您将永远无法防止调整大小。那就是我现在要做的。
- 当libstdc 执行调整大小时,请删除过期的项目。一个想法还不错,但是如果存在第三个实现,甚至可以更早地调整大小,例如,当负载因子达到1-EPSILON时,那么对于该实施,我将永远不会删除过期的项目。鉴于Microsoft和libstdc 已经对负载因子有所不同,因此我看不出这样的第三个实现可能不会出现的原因。还是有原因?
您可以考虑使用boost::intrusive::unordered_set
,并根据expired
项目的负载因子和数量重新进行重新进行。
相关文章:
- 为char数组调整zlib-zpipe
- 调整大小后指向元素值的指针unordered_map有效?
- 在C++中调整向量中的索引
- 哪些库可以通过Opencv调整曝光率
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- 在容量内调整矢量大小时的性能影响
- 将 boost::odeint 与向量类一起使用,而无需调整向量的大小
- 将摄像机调整到俯视图
- Qt 图表条形图调整大小崩溃
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 调整布局上的 QGraphicsView 小部件的大小
- 如何在构建链接列表时调整头、尾指针
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 当您在此单词中搜索单词时调整字符数组的大小?
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何按另一个向量的方向调整一个向量?
- 使用大小调整大小调整 wxListView 的大小
- 调整大小和复制哈希表数组中的元素
- 具有调整对齐方式的类型定义