我的实际情况是我有一个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);
//...
}