【发布时间】:2016-08-19 19:49:53
【问题描述】:
我有以下容器:
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 个。
- 我会多次查询key。
- 通常查询和插入没有特定的顺序。
【问题讨论】:
-
平均而言
find是恒定的时间,所以我怀疑你会更快地找到任何东西。 -
如果
find(0)返回0,这意味着什么?是否找到“0”? -
与向量相比,无序映射增加了相当多的开销;除非预期的占用率非常低,否则您可能会发现 std::array
更快更小。 -
我的问题是,如果调用者查询
0并且你的函数返回0,调用者将如何解释返回值?0是“找到”还是“未找到”? -
使用
std::vector<std::pair<uint8_t,int>>它在内存中占用的空间比std::unordered_map少。使用std::find会一样快,因为您有一个相对较小的缓冲区可供搜索。
标签: c++ c++11 unordered-map