繁体   English   中英

C ++-配对图-检查是否存在具有给定第一个坐标的一对

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

我拿着一张按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()操作,因为我也需要使用它。

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 / unordered_map。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM