【问题标题】:Find in a map by value - preference of methods in terms of speed按值在地图中查找 - 方法在速度方面的偏好
【发布时间】:2014-02-22 14:51:02
【问题描述】:

我想到了四种按值在地图中查找的方法。就速度而言,这些方法的优先顺序是什么?

假设 key 和 value 在它们之间都是唯一的。

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

  1. 如果 boost 库可用,请使用 boost::bimap
  2. std::find_if 与带有一些相等比较逻辑的谓词/函子一起使用
  3. 在填充std::map<int, string> 时,创建并填充 另一个std::map<std::string, int> 并在第二张地图上执行map::find
  4. 遍历整个地图并检查if (iter->second == value_to_find), 如果找到break;

我将始终按键执行查找,并按值执行一次或两次。

【问题讨论】:

  • 如果在std::map 中按值搜索是一种常见操作,那么您可能一开始就不应该使用std::map
  • 我认为,当您使用 std:map 时,第 4 种方法没有意义。为什么可以使用 map::find 代替?
  • 如果要同时按值和键查找,boost::bimap 是正确的选择。但是如果你只想按值搜索,为什么不使用以字符串“value”为键的map或multimap呢?无论如何,如果您对第三点有问题,您可能不得不使用 multimap 来代替

标签: c++ map stl containers


【解决方案1】:

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

选项 1 和 3 也是等效的。运行时将是 O(log n) 用于地图,O(1) 用于无序地图。当您选择选项 3 时,您实际上是在重新发明 boost:bimap。

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

当然,这一切的前提是您要在这个数据结构中存储如此多的值,这实际上很重要。当条目数量较少时,仅使用 std::vector 并手动迭代它实际上可以成为速度方面的优越解决方案。

【讨论】:

  • 在我的例子中,map 包含大量的值来产生影响。矢量不是一种选择。
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多