根据减法运算的结果排序
Sort Based on the Result of a Subtraction Operation
我的实际情况是我有一个 vector<Point3D>
,其中 Point3D
是我定义的 class。 Point3D
小于运算符将 Point3D
定义为更靠近原点的值。加法运算符被定义为允许 Point3D
被另一个 Point3D
移位。我想做的是:
在向 POINT3D
中的每个元素添加 POINT3D
后,找到定义 Point3D
小于运算符的 vector
的最小元素=16=]
现在我想在不实际修改 vector
的情况下执行此操作。如果标准为我提供类似 min_element
的东西,我会很棒。
为了简化问题,以下是我希望看到的内容:
给定一个 vector<int>
,如果所有元素都乘以 -1,找到最小的元素。理想情况下只使用一个标准函数。
这可以通过 max_element
来解决,但这 不会 解决我的实际问题,对我没有帮助。
对于测试示例,给定:vector<int>{1, 3, 4, 2}
正确的解决方案将提供指向第三个元素 (4) 的指针或索引。有没有简单的方法来解决这个问题,还是我需要编写自己的循环遍历所有元素并保持指向最小值的指针?
只需将有问题的点添加到发送到 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);
//...
}
您只需遍历您的序列,保持 pointer/iterator 到目前看到的最小值。您可以传递一个带有两个参数的函数对象 comp,如果第一个参数小于第二个参数,则 returns 为真。
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;
}
现在我们使用您想用来比较两个整数的任何函数来调用 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; });
我的实际情况是我有一个 vector<Point3D>
,其中 Point3D
是我定义的 class。 Point3D
小于运算符将 Point3D
定义为更靠近原点的值。加法运算符被定义为允许 Point3D
被另一个 Point3D
移位。我想做的是:
在向 POINT3D
中的每个元素添加 POINT3D
后,找到定义 Point3D
小于运算符的 vector
的最小元素=16=]
现在我想在不实际修改 vector
的情况下执行此操作。如果标准为我提供类似 min_element
的东西,我会很棒。
为了简化问题,以下是我希望看到的内容:
给定一个 vector<int>
,如果所有元素都乘以 -1,找到最小的元素。理想情况下只使用一个标准函数。
这可以通过 max_element
来解决,但这 不会 解决我的实际问题,对我没有帮助。
对于测试示例,给定:vector<int>{1, 3, 4, 2}
正确的解决方案将提供指向第三个元素 (4) 的指针或索引。有没有简单的方法来解决这个问题,还是我需要编写自己的循环遍历所有元素并保持指向最小值的指针?
只需将有问题的点添加到发送到 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);
//...
}
您只需遍历您的序列,保持 pointer/iterator 到目前看到的最小值。您可以传递一个带有两个参数的函数对象 comp,如果第一个参数小于第二个参数,则 returns 为真。
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;
}
现在我们使用您想用来比较两个整数的任何函数来调用 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; });