根据减法运算的结果排序

时间:2015-12-01 21:38:36

标签: c++ vector 3d

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

在向{{{}}中的每个元素添加vector后,查找Point3D定义POINT3D小于运算符的最小元素。 1}}

现在我想在不实际修改vector的情况下这样做。如果标准为我提供了类似vector这样的内容,我会很棒。

为简化问题,请参阅以下内容:

给定min_element如果所有元素都乘以-1,则找到最小的元素。理想情况下只使用一个标准函数。

这可以通过vector<int>解决,解决我的实际问题,对我没用。

对于测试示例,给定:max_element正确的解决方案将为第三个元素(4)提供指针或索引。有没有一种简单的方法来解决这个问题,还是我需要编写自己的循环迭代所有元素并保持指向min的指针?

2 个答案:

答案 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; });