让我们假设我用这样的lambda调用sort,nearPoints
是3D中的点矢量。
sort(nearPoints.begin(), nearPoints.end(),
[srcPoint](const kd_point &A, const kd_point &B)
{return Distance(srcPoint, A) < Distance(srcPoint, B); });
为了节省对Distance
的冗余呼叫,我想预先计算这些值,然后调用排序来使用它们。
优雅的解决方案是,恕我直言,准备第二个带距离的矢量,在lambda中读取它,并根据需要切换元素。
我的问题是如何在A
中找到B
和nearPoints
的索引,因此我知道在第二个向量中要访问哪些元素。有办法吗?
我知道我可以创建一个新的向量,每个元素包含一个点及其距srcPoint
的距离,但这需要在排序之前填充新的向量,并在之后以正确的顺序提取点。排序,这让我感到不雅。
答案 0 :(得分:0)
可以这样做,你可以得到索引:
std::sort(std::begin(near_points), std::end(near_points),
[src_point, &near_points](int const &a, int const &b){
auto ia = &a - near_points.data();
auto ib = &b - near_points.data();
...
return ...;
});
但是这将是无用的,因为元素会一直被排序。
您可以做的是创建std::map
的哈希地图地图(std::unordered_map
或<kd_point, int>
),预先计算距离。你需要测量,看它是否会更快,因为地图在空间和时间方面都会增加相当大的开销。 Distance()
的计算必须非常慢才能证明这一点。
如果Distance
只是一个欧几里德距离,你可以做的简单而有效的优化是:你所做的只是比较距离,你不需要计算平方根< / strong>(这是最耗时的)。因此,您只需SquareDist
计算(x2-x1)^2 + ...
。并且lambda的条件变为SquareDist(src, a) < SquareDist(src, b)
你必须小心不要溢出。