我的实际情况是我有一个vector<Point3D>,其中Point3D是我定义的类。 Point3D小于运算符将Point3D定义为更靠近原点的地方。加法运算符被定义为允许Point3D移位另一个Point3D。我想做的是:

在将vector添加到Point3D中的每个元素后,找到定义为POINT3D小于运算符的vector的最小元素是什么

现在,我想执行此操作而不实际修改vector。如果该标准为我提供了类似min_element这样的功能,那我将很棒。



为了简化问题,这是我想看到的:

给定一个vector<int>,如果所有元素都乘以-1,则找到最小的元素。理想情况下,仅使用一个标准功能。

可以通过执行max_element来解决,这不能解决我的实际问题,对我没有帮助。

对于一个测试示例,给定:vector<int>{1, 3, 4, 2}正确的解决方案将提供指向第三个元素(4)的指针或索引。有没有简单的方法可以解决此问题,还是我需要编写自己的循环遍历所有元素并保持指向min的指针的循环?

最佳答案

只需将有问题的点添加到发送到max_element的比较函数的每个点即可。

#include <algorithm>
#include <vector>
//...
Point3D somePt;
std::vector<Point3D> vectPts;
//...
//... assume that somePt has a value you want to add and vectPts is the vector
//    of points to get the minimum of
//...
auto smallestPtIter = std::max_element(vectPts.begin(), vectPts.end() [&]
(const Point3D& p1, const Point3D& p2) { return p1 + somePt < p2 + somePt; });


如果您使用的是11之前的C ++版本,则可以执行以下操作:

#include <algorithm>
#include <vector>
//...
struct functor
{
   Point3D adder;
   functor(const Point3D& a) : adder(a) {}
   bool operator()(const Point3D& p1, const Point3D& p2)
   { return p1 + adder < p2 + adder; }
};

void foo()
{
    Point3D somePt;
    std::vector<Point3D> vectPts;
    //...
    //... assume that somePt has a value you want to add and vectPts is the vector
    //    of points to get the minimum of
    //...
    functor f(somePt);
    std::vector<Point3D>::iterator smallestPtIter = std::max_element(vectPts.begin(), vectPts.end(), f);
//...
}

10-07 15:53