【发布时间】:2012-03-26 15:21:34
【问题描述】:
我想创建一个 STL 映射来查找一个项目是否与 3 维空间中的另一个项目足够接近。到目前为止,我的“小于函子”运行良好,粘贴到以下链接。
现在这个问题还不是“最近邻”问题。而是“在一定距离内是否有邻居”的问题。
我的示例只显示了一个维度。为了清楚起见,我跳过了 Y/Z 尺寸。
class ApproximateLessFunctor {
public:
ApproximateLessFunctor( float fudgeFactor ) :
mFudgeFactor( fudgeFactor ) {};
bool operator()( float a, float b ) const {
return (a < (b - mFudgeFactor) );
}
float mFudgeFactor;
};
typedef map<float, int, ApproximateLessFunctor> XAxisMap;
class XAxis {
public:
XAxisMap vMap;
XAxis(ApproximateLessFunctor functor, float x, int v)
: vMap( functor )
{
vMap.insert(make_pair(x, v));
}
};
在极少数情况下,我的意思是——非常罕见——当位置重叠时,地图找不到匹配的条目。
还有什么我可以做的更好的实现,仍然使用 STL 容器吗?
【问题讨论】:
-
所以这是搜索半径的最近邻问题,对吧?您可能想看看 FLANN 库,它实现了半径搜索。我猜其他图书馆也是如此。
-
你的函子必须定义一个strict weak ordering。你的没有。
-
实际上,再看一遍,我认为它确实定义了 SWO,但我认为多维版本不会。为什么不发布呢?
-
@OliCharlesworth 他的函数没有定义 SWO,因为如果
b - a < fudge和c - b < fudge,他的函数可能对a, c返回 true,但对a, b和b, c返回 false。 -
@OliCharlesworth 是要求它可以双向工作。那
!(a < b) || !(b < c)) => !(a < c)。 (想一想,我想你会同意的。)
标签: c++ stl map approximate approximate-nn-searching