unordered_map 中不存在键时返回零

Returning zero when the key is not exist in unordered_map

我有以下容器:

std::unordered_map<uint8_t,int> um;

um 假定有 0 到 255 之间的键,但不是全部。所以,在某些时候我想要求它给我例如键 13 的值。如果它在那里,我想要它的值(保证不为 0)。如果不是,我希望它 return 0。

实现它的最佳方式(性能观点)是什么?

到目前为止我尝试过的方法:使用 find 和 return 0(如果未找到)或值(如果找到)。

P.S。更改为包含 256 个项目的 std::vector<int> 不是一个选项。我负担不起 space 总是存储 256 个值。


编辑:

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

附加信息:

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

您的 unordered_map 应该具有较低的速度复杂度。

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

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

您甚至可以通过因式分解 size/capacity 来做得更好,但它不再在 std:: 中。

使用 vector,您还有另一项交易:搜索和添加密钥的复杂性:

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

为了 space 紧凑性,我可能会使用向量。

为了对数搜索性能而对其进行排序很诱人。但是由于预期的元素数量少于 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