当unordered_map中键不存在时返回零

Returning zero when the key is not exist in unordered_map

本文关键字:不存在 返回 unordered map      更新时间:2023-10-16

我有以下容器:

std::unordered_map<uint8_t,int> um;
假设

um的键值在0到255之间,但不是全部。所以,在某个时间点,我想让它给我键13的值。如果它在那里,我想要它的值(保证不为0),如果不是,我想要它返回0。

实现这一点的最佳方式(从性能的角度来看)是什么?

我到现在为止所尝试的:使用find,如果没有找到返回0,如果找到返回值。

注:不能更改为包含256项的std::vector<int>。我负担不起总是存储256个值的空间。


编辑:

我的问题是直方图计算问题键(颜色0-255)值(频繁,int就足够了)。如果我只知道某个键是否存在,我是不会满足的。我还需要值(频率)。

附加信息:

    我永远不会删除任何项目。
  • 我有时会添加项目(最多256项),通常少于10项。
  • 我会查询很多次键。
  • 通常查询和插入没有特定顺序。

你需要在内存和速度之间进行权衡。

你的unordered_map应该有更少的速度复杂度。

使用std::vector<std::pair<uint8_t, int>>将更紧凑(和更缓存友好)。

std::pair<std::vector<uint8_t>, std::vector<int>>将更加紧凑(uint8_tint之间没有填充)

您甚至可以通过分解大小/容量来做得更好,但在std::中不再这样做了。

对于vector,您有另一个交易:搜索和添加键:

的复杂性
  • 未排序向量:常量添加,线性搜索
  • 排序向量:线性添加(由于插入值在向量的中间),对数搜索。

我可以使用向量来实现空间紧凑性。

为了对数搜索性能,保持排序是很诱人的。但是,由于期望的元素数小于10,我可能会让它不排序,并使用线性搜索。

vector<pair<uint8_t, int>> data;

如果期望的元素数量很大,那么使用排序向量可能会有所帮助。

Boost提供了一个类似映射的接口,具有类似矢量的布局。参见boost flat_map http://www.boost.org/doc/libs/1_48_0/doc/html/container/non_standard_containers.html#container.non_standard_containers.flat_xxx