[英]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> >
查找具有特定第一个坐标的任何元素的解决方案将不起作用,因为我只能保证同时为K
和V
提供了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.