【问题标题】:C++ - Map of pairs - check if a pair with given first coordinate existsC++ - 对的映射 - 检查是否存在具有给定第一个坐标的对
【发布时间】:2016-04-09 08:20:55
【问题描述】:

我拿着一张按std::pair<K, V> 排序的地图。 (它的类型是std::map<std::pair<K, V>, size_t>)。我想找到具有给定第一个坐标的任何对(即固定K,查找地图中是否有任何对象,形式为std::pair<K, _> 的键,我不关心第二个坐标)。显然它可以在 O(log n) 中完成,因为搜索特定对也在 O(log n) 中完成 [这是标准的 find() 操作]。有什么方法可以做到这一点,而不必从头开始编写我自己的地图?

还有一件事 - 我无法更改比较功能,因为我希望像 (1,2), (1,3) 这样的对是不同的,如果比较器只比较键,它会将它们视为相等。我想保留标准的 find() 操作,因为我也需要使用它。

Finding any element with specific first coordinate in set<pair> > 的解决方案将不起作用,因为我只保证operator < 提供给KV。不知道std::numeric_limits是不是专门针对K

【问题讨论】:

  • 泛型类型(模板类)
  • 我只保证 K 和 V 都提供了操作符
  • 如果你允许 C++14,你可能会得到更多有趣的答案,涉及 is_transparent。
  • 我投票决定重新提出您的问题,因为您说您不知道是否可以获得最小值。我还编辑你的问题来解释这一点。如果您不喜欢,请随时编辑。
  • 您可以将 numeric_limits 值替换为 V 的任何值(例如,从第一个元素复制它)。然后你需要检查lower_bound和前一个元素的输出,但是这个想法仍然有效。

标签: c++ algorithm stl c++14


【解决方案1】:

如果您需要 any 值的键等于 x,请为 V 使用虚拟值。如果它是默认可构造的,您可以将 V() 作为键的第二个虚拟元素;否则从地图中选择值(例如从第一个元素中)。然后使用该键搜索 lower_bound 并查看前一个元素:

auto it = my_container.lower_bound(std::make_pair(x, V()));
bool found;
if (it == my_container.end()) {
    found = false;
} else {
    found = it->first.first == x;
    if (!found && it != my_container.begin()) {
        it--;
        found = it->first.first == x;
    }
}

【讨论】:

    【解决方案2】:

    我建议将地图分成两张地图:

    multimap<K, map<V, size_t>>
    

    并使用 make_pair 和 get 执行配对构造/解构。

    如果您不需要保留顺序,还可以考虑将 unordered_multimap/unordered_map 用于外部/内部映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-19
      • 2017-06-19
      • 2022-12-13
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多