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

时间:2015-12-03 20:11:37

标签: 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); });

为了节省对Distance的冗余呼叫,我想预先计算这些值,然后调用排序来使用它们。

优雅的解决方案是,恕我直言,准备第二个带距离的矢量,在lambda中读取它,并根据需要切换元素。

我的问题是如何在A中找到BnearPoints的索引,因此我知道在第二个向量中要访问哪些元素。有办法吗?

我知道我可以创建一个新的向量,每个元素包含一个点及其距srcPoint的距离,但这需要在排序之前填充新的向量,并在之后以正确的顺序提取点。排序,这让我感到不雅。

1 个答案:

答案 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)你必须小心不要溢出。