我有以下容器:
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就足够了)。如果我知道某些密钥存在与否,我将不会满意。我也需要价值(频繁)。
其他信息:
答案 0 :(得分:4)
你需要在记忆和速度之间进行权衡。
您的unordered_map
应该具有较低的速度复杂性。
使用std::vector<std::pair<uint8_t, int>>
会更紧凑(并且更加缓存友好)。
std::pair<std::vector<uint8_t>, std::vector<int>>
会更加紧凑(uint8_t
和int
之间没有填充)
您甚至可以通过分解大小/容量来做得更好,但它不再是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