当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),如果不是,我想要它返回0。
实现这一点的最佳方式(从性能的角度来看)是什么?
我到现在为止所尝试的:使用find,如果没有找到返回0,如果找到返回值。
注:不能更改为包含256项的std::vector<int>
。我负担不起总是存储256个值的空间。
编辑:
我的问题是直方图计算问题键(颜色0-255)值(频繁,int就足够了)。如果我只知道某个键是否存在,我是不会满足的。我还需要值(频率)。
附加信息:
- 我永远不会删除任何项目。
- 我有时会添加项目(最多256项),通常少于10项。
- 我会查询很多次键。
- 通常查询和插入没有特定顺序。
你需要在内存和速度之间进行权衡。
你的unordered_map
应该有更少的速度复杂度。
使用std::vector<std::pair<uint8_t, int>>
将更紧凑(和更缓存友好)。
std::pair<std::vector<uint8_t>, std::vector<int>>
将更加紧凑(uint8_t
和int
之间没有填充)
您甚至可以通过分解大小/容量来做得更好,但在std::
中不再这样做了。
对于vector
,您有另一个交易:搜索和添加键:
- 未排序向量:常量添加,线性搜索
- 排序向量:线性添加(由于插入值在向量的中间),对数搜索。
我可以使用向量来实现空间紧凑性。
为了对数搜索性能,保持排序是很诱人的。但是,由于期望的元素数小于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
- 查找不存在的键时,unordered_map返回什么
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- inet_ntop返回不存在的地址
- lower_bound 在 C++ STL 中返回迭代器,即使元素不存在也是如此.如何避免这种情况?
- 函数 NetShareGetInfo 始终返回 2310(此共享不存在)
- ifstream::is_open 返回 true,即使该位置不存在文件也是如此
- 为什么 opendir() 返回目录在 android 上不存在
- 从返回函数中推断不存在的模板参数
- 为什么要对 map::find 应用不存在的键将返回一个C++中第一个值映射大小的迭代器
- 当键可能不存在时,如何返回对对象的引用(从unordered_map)
- 关于返回对不存在数据的引用的设计
- QMediaPlaylist::addMedia() 对于不存在的文件返回 true
- 我应该使用什么函数签名来返回对可能不存在的对象的引用
- 对于不存在的对象,Amazon S3 HEAD 请求返回空响应,而不是 404
- 函数按值返回对象,如果对象不存在,则不返回任何内容
- 我想在 c++ 中为 map<> 的给定键返回一个值。如果 KEY 在 map<> 中不存在,要返回什么?
- 当键不存在时,返回unordered_multimap::bucket()的值
- 当unordered_map中键不存在时返回零
- GetFileAttributes为不存在的文件返回FILE_ATTRIBUTE_ARCHIVE
- Qdir的函数exist()总是返回true,即使目录不存在