当unordered_map

时间:2016-08-19 19:49:54

标签: c++ c++11 unordered-map

我有以下容器:

std::unordered_map<uint8_t,int> um;
假设{p> um具有0到255之间的键,但不是全部。所以,在某些时候我想让它给我一个关键13的值。如果它在那里,我想要它的值(保证不是0)。如果没有,我希望它返回0.

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

到目前为止我尝试过:使用find,如果找不到,则返回0,如果找到则返回值。

P.S。更改为包含256个项目的std::vector<int>不是一个选项。我总是无法承受存储256个值的空间。

修改

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

其他信息:

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

2 个答案:

答案 0 :(得分:4)

你需要在记忆和速度之间进行权衡。

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

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

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

您甚至可以通过分解大小/容量来做得更好,但它不再是std::

使用vector,您将获得另一个交易:搜索和添加密钥的复杂性:

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

答案 1 :(得分:0)

我可能会使用矢量来实现空间紧凑性。

很容易将其按对数搜索性能排序。但由于预期的元素数量少于10,我可能只是将其保留为未排序并使用线性搜索。

所以

vector<pair<uint8_t, int>> data;

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

Boost提供了类似于矢量的布局的类似地图的界面。请参阅http://www.boost.org/doc/libs/1_48_0/doc/html/container/non_standard_containers.html#container.non_standard_containers.flat_xxx

上的boost flat_map