我有以下容器:
std::unordered_map<uint8_t,int> um;
um
假定 key 的范围在 0 到 255 之间,但不是全部。因此,在某个时间点我想要求它给我 key 13 的值。如果它在那里,我想要它的值(保证不为 0)。如果不是,我希望它返回 0。
实现此目的的最佳方法(性能角度)是什么?
到目前为止我尝试过的:使用find,如果没有找到则返回0,如果找到则返回值。
附注更改为std::vector<int>
包含 256 个项目的选项不是一个选项。我无法承担始终存储 256 个值的空间。
编辑:
我的问题是直方图计算问题键(颜色0-255)值(频繁,int就足够了)。如果我只知道某个键存在或不存在,我不会满足。我还需要值(频繁)。
其他信息:
- 我永远不会删除任何项目。
- 我有时会添加项目(最多 256 个项目),通常少于 10 个。
- 我会多次查询 key 。
- 通常查询和插入没有特定的顺序。
最佳答案
您需要在内存和速度之间进行权衡。
您的unordered_map
应该具有较低的速度复杂性。
使用std::vector<std::pair<uint8_t, int>>
会更紧凑(并且对缓存更友好)。
std::pair<std::vector<uint8_t>, std::vector<int>>
会更加紧凑( uint8_t
和 int
之间没有填充)
您甚至可以通过分解大小/容量来做得更好,但它不再在 std::
中。 .
与vector
,那么您还需要进行另一项交易:搜索和添加键的复杂性:
- 未排序 vector :常量相加、线性搜索
- 排序 vector :线性相加(由于在 vector 中间插入值)、对数搜索。
关于c++ - 当 unordered_map 中不存在键时返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39046715/