【问题标题】:c++ find by value in mapc ++在地图中按值查找
【发布时间】:2020-02-03 09:43:47
【问题描述】:

我想按值在地图中找到对应的键。
我可以线性迭代并找到关键,但如果我的所有值也是唯一的,我们是否还有另一个更好的解决方案。

提前致谢。

【问题讨论】:

标签: c++ data-structures


【解决方案1】:

你可以使用std::find_if

#include <algorithm>

template<typename M, typename V>
auto get_map_iterator_from_value(const M& m, const V& v) {
    return std::find_if(std::begin(m), std::end(m),
                        [&v](const auto& pair) { return pair.second == v; });
}

...

auto it = get_map_iterator_from_value(your_map, your_value);

但它会比在 key 上查询时要慢,因为它也必须遍历地图中的每个条目,直到找到匹配项。

与顺序搜索相比,在搜索包含许多条目的地图时,一个改进可能是利用std::find_ifs 并行执行支持:

#include <algorithm>
#include <execution>

template<typename M, typename V>
auto get_map_iterator_from_value(const M& m, const V& v) {
    return std::find_if(std::execution::par, std::begin(m), std::end(m),
                        [&v](const auto& pair) { return pair.second == v; });
}

如果这真的使它更快或不需要用你的实际地图进行测试。

注意:如果您经常需要这样做,像Boost.Bimap 这样的双向映射会更好。

【讨论】:

  • '我可以线性迭代' – 好吧,std::find_if 也不会做任何其他事情,不是吗?
  • @Aconcagua 不,它必须遍历地图中的每个条目,直到找到匹配项。这只是一种更容易改进的替代方案。我现在添加了一项可能的改进。
  • @Aconcagua 我应该删除答案的第一部分,只保留搜索并行化的部分吗?
  • 我很高兴提到标准find_if,我只想更清楚地表达这只是在地图上线性迭代的另一种方式(迭代只是隐藏在函数...),因为问题作者明确要求“更好”的东西(但是我们可以定义它...)。
  • @Aconcagua 这就是“但它会比在键上查询时慢 因为它必须遍历地图中的每个条目直到它找到匹配项”第一个版本下的注释是为了表达。我添加了一个“too”以使其更清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
相关资源
最近更新 更多