C++ 有没有办法从传递给sort的lambda中获取元素位置?
假设我用一个类似这样的lambda调用sort,C++ 有没有办法从传递给sort的lambda中获取元素位置?,c++,c++11,lambda,C++,C++11,Lambda,假设我用一个类似这样的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); }); 排序(nearPoints.begin(),nearPoints.e
nearPoints
是3D中的点向量
sort(nearPoints.begin(), nearPoints.end(),
[srcPoint](const kd_point &A, const kd_point &B)
{return Distance(srcPoint, A) < Distance(srcPoint, B); });
排序(nearPoints.begin(),nearPoints.end(),
[srcPoint](常数kd_点和A、常数kd_点和B)
{返回距离(srcPoint,A)<距离(srcPoint,B);};
为了节省对距离的冗余调用
,我想预先计算这些值,并调用sort来使用它们
优雅的解决方案是,IMHO,准备第二个带距离的向量,在lambda中读取它,并根据需要切换元素
我的问题是如何在nearPoints
中找到A
和B
的索引,这样我就知道在第二个向量中要访问哪些元素。有办法吗
我知道我可以创建一个新的向量,每个元素包含一个点及其与
srcPoint
的距离,但这需要在排序之前填充新向量,并在排序之后按正确的顺序提取点,这让我觉得不雅。可以完成,您可以获得索引:
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
),其中预计算了距离。你必须测量一下,看看它是否会更快,因为地图在空间和时间上都会增加相当大的开销。为了证明这一点,Distance()
的计算速度必须非常慢
如果
距离
只是一个欧几里德距离,那么您可以做的简单而有效的优化是:因为您所做的只是比较距离,您不需要计算平方根(这是最耗时的)。所以你有SquareDist
,你只需要计算(x2-x1)^2+…
。lambda的条件变成SquareDist(src,a)
你必须小心不要溢出。你的标语中的解决方案对我来说似乎很合理。嗯,索引就是&a-nearPoints.data(),但是它在这里是没有用的,因为sort
将在所有地方交换元素。如果您想加快速度,请按距离平方进行排序。它将给出相同的顺序,但是sqrt
操作是迄今为止欧几里德距离计算中最昂贵的部分良好的起点。