C++ 有没有办法从传递给sort的lambda中获取元素位置?

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

假设我用一个类似这样的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.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
操作是迄今为止欧几里德距离计算中最昂贵的部分良好的起点。