C++-对映射-检查是否存在具有给定第一坐标的对

C++ - Map of pairs - check if a pair with given first coordinate exists

本文关键字:坐标 映射 检查 是否 存在 C++-      更新时间:2023-10-16

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

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

set<pair> >中查找具有特定第一坐标的任何元素的解决方案将不起作用,因为我只能保证为KV提供operator <。我不知道std::numeric_limits是否专门用于K

如果需要键等于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;
    }
}

我建议将地图分解为两个地图:

multimap<K, map<V, size_t>>

并使用make_pair和get进行配对构建/解构。

如果您不需要保留顺序,也可以考虑对外部/内部映射使用unordered_multimap/unorderede_map。