按值在地图中查找 - 在速度方面的方法偏好

时间:2014-02-22 14:51:03

标签: c++ map stl containers

我想到了四种方法可以在地图中找到值。在速度方面,这些方法的优先顺序是什么?

假设密钥和值都是唯一的。

std::map<int, std::string>std::unordered_map<int, std::string>

  1. 如果提升库,则使用boost::bimap
  2. std::find_if与带有一些相等比较逻辑的谓词/函子一起使用
  3. 在填充std::map<int, string>时,创建&amp;填充 另一个std::map<std::string, int>并在第二张地图上执行map::find
  4. 浏览整个地图并查看if (iter->second == value_to_find), 如果找到break;
  5. 我将始终按键执行查找,按值执行一次或两次。

1 个答案:

答案 0 :(得分:3)

选项2和4执行完全相同的操作:逐个迭代整个映射,直到找到匹配的条目。两种情况下的运行时都是O(n)

选项1和3也是等效的。地图的运行时间为O(log n),无序地图的运行时间为O(1)。当你选择选项3时,你实际上正在重新发明提升:bimap。

所以我建议您选择选项1并在可用时使用boost:bimap。当由于某种原因无法使用boost时,您应该重建功能并使用两个映射并实现代码以使它们自己保持同步。

当然,这一切都是在你将要在这个数据结构中存储如此多的值实际上很重要的前提下进行的。当条目数量很小时,只需使用std::vector并手动迭代它就可以成为速度方面的优秀解决方案。