我的实际情况是我有vector<Point3D>
其中Point3D
是我定义的类。 Point3D
小于运算符将Point3D
定义为更小,如果它更靠近原点。添加运算符被定义为允许Point3D
被另一个Point3D
移位。我想做的是:
在向{{{}}中的每个元素添加vector
后,查找Point3D
定义POINT3D
小于运算符的最小元素。 1}}
现在我想在不实际修改vector
的情况下这样做。如果标准为我提供了类似vector
这样的内容,我会很棒。
为简化问题,请参阅以下内容:
min_element
如果所有元素都乘以-1,则找到最小的元素。理想情况下只使用一个标准函数。这可以通过vector<int>
解决,不解决我的实际问题,对我没用。
对于测试示例,给定:max_element
正确的解决方案将为第三个元素(4)提供指针或索引。有没有一种简单的方法来解决这个问题,还是我需要编写自己的循环迭代所有元素并保持指向min的指针?
答案 0 :(得分:2)
只需将问题点添加到发送到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);
//...
}
答案 1 :(得分:0)
您只需遍历序列,将指针/迭代器维持到目前为止看到的最小值。您可以传递一个带有两个参数的函数对象comp,如果第一个小于第二个参数,则返回true。
using iterator = std::vector<int>::iterator;
iterator smallest(iterator begin, iterator end,
std::function<bool(int, int)> comp) {
auto min_ptr = begin;
for (; begin != end; ++begin) {
if (comp(*begin, *smallest)) smallest = begin;
}
return smallest;
}
现在我们使用你想用来比较两个整数的函数调用最小值。 lambda表达式很方便。但是你可以使用函数指针或函数对象,因为它们都将绑定到std :: function参数。
vector<int> my_vector {1, 4, 6, 3};
auto min_ptr = smallest(my_vector.begin(), my_vector.end(),
[](int i, int j) { return -1 * i < -1 * j; });