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 就足够了)。如果我只知道某个密钥存在与否,我不会满意。我还需要价值(频繁)。
附加信息:
- 我永远不会删除任何项目。
- 我有时会添加项目(最多256项),通常少于10项。
- 我会查询很多次key。
- 通常查询和插入没有特定顺序。
您需要在内存和速度之间进行权衡。
您的 unordered_map
应该具有较低的速度复杂度。
使用 std::vector<std::pair<uint8_t, int>>
会更紧凑(对缓存更友好)。
std::pair<std::vector<uint8_t>, std::vector<int>>
会更紧凑(uint8_t
和 int
之间没有填充)
您甚至可以通过因式分解 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
我有以下容器:
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 就足够了)。如果我只知道某个密钥存在与否,我不会满意。我还需要价值(频繁)。
附加信息:
- 我永远不会删除任何项目。
- 我有时会添加项目(最多256项),通常少于10项。
- 我会查询很多次key。
- 通常查询和插入没有特定顺序。
您需要在内存和速度之间进行权衡。
您的 unordered_map
应该具有较低的速度复杂度。
使用 std::vector<std::pair<uint8_t, int>>
会更紧凑(对缓存更友好)。
std::pair<std::vector<uint8_t>, std::vector<int>>
会更紧凑(uint8_t
和 int
之间没有填充)
您甚至可以通过因式分解 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