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(logn)中完成,因为搜索特定的对也可以在O中完成[这是标准的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/unorderede_map。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 如何使用 std::multimap 将整数键映射到两个用作多维数组坐标的整数值(对于井字)?
- 如何在三角形曲面细分评估着色器中插值 UV 映射坐标?
- 如何插值像素坐标而不是像素值?需要它来为相机生成校正重映射
- C++/SDL-矩形坐标映射
- 球面坐标映射创建双环状体
- C 椭圆坐标映射
- 我想使用C++映射,以存储一个矩形id的4个坐标,任何人都可以举一个例子吗
- 创建用于将结构坐标存储为键和线号作为值的映射
- Kinect v2 将颜色坐标映射到相机空间
- 仅对从扭曲图像获得的坐标应用重映射,而不对整个图像应用重映射
- 在C++中的OpenGL中将坐标从三维透视投影映射到二维正投影
- 制作一个以坐标为键的std::映射
- 查找/重新映射OpenGL ES坐标平面的边界
- 2d(3d)坐标的哈希映射(即双精度向量)
- 如何映射项目坐标
- Qt中的坐标映射
- 我是否正确地指定了立方体映射的坐标