c++ - 当 unordered_map 中不存在键时返回零

标签 c++ c++11 unordered-map

我有以下容器:

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_tint 之间没有填充)

您甚至可以通过分解大小/容量来做得更好,但它不再在 std:: 中。 .

vector ,那么您还需要进行另一项交易:搜索和添加键的复杂性:

  • 未排序 vector :常量相加、线性搜索
  • 排序 vector :线性相加(由于在 vector 中间插入值)、对数搜索。

关于c++ - 当 unordered_map 中不存在键时返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39046715/

相关文章:

c++ - std::regex_replace 仅第一次出现

C++类设计和按值返回

c++ - Intel 上的多线程比 AMD 慢得多

c++ - 在重载决议方面,xvalue 和 prvalue 之间的行为差​​异的一个具体、简洁的例子是什么?

c++ - 如何在 std::unordered_map 中就地构造某个类的对象?

c++ - 智能指针和unordered_map,unordered_set等

c++ - 通过减少 if 语句使代码更高效

C++ 被迫进行奇怪的转换以摆脱 "expression should be a modifiable lvalue"

c++ - 调用复制 ctor 而不是移动 ctor

c++ - 通过其他字符串索引字符串