提问人:Polynomial length of study 提问时间:10/7/2021 最后编辑:Vlad from MoscowPolynomial length of study 更新时间:10/7/2021 访问量:39
使用点 (x,y) 值功能对向量进行排序,错误:没有用于调用类型为“__gnu_cxx::__ops::_Iter_less_iter”的对象的匹配函数
Sorting vector with point (x,y) values functionality, error: no matching function for call to object of type '__gnu_cxx::__ops::_Iter_less_iter'
问:
我尝试对带有点(x,y 值)的向量进行排序,首先按 x 排序,然后按 y 值排序,这 是我的实现,有人可以告诉我这是否有效,因为我收到以下错误:
错误:对类型为“__gnu_cxx::__ops::_Iter_less_iter”的对象的调用没有匹配函数
我猜它以某种方式来自 std::sort,但我不是 100% 确定?
struct P {
float x, y;
P(float x_, float y_) : x(x_), y(y_) {}
};
std::vector<P> sortingPointsX(const std::vector<P> &p) {
std::vector<P> copyP = p;
std::sort(copyP.begin(), copyP.end(),
[](P * a, P * b) -> bool
{ return a->x < b->x);
std::sort(copyP.begin(), copyP.end(),
[](P * a, P * b) -> bool
{ return a->y < b->y);
return copyP
}
答:
2赞
Vlad from Moscow
10/7/2021
#1
对于初学者,而不是你自己的类,你可以使用标头中声明的标准类模板,因为已经为这个类模板定义了。struct P
std::pair
<utility>
operator <
在这种情况下,您可以只写
std::vector<std::pair<float, float>> sortingPointsX( const std::vector<std::pair<float, float>> &p )
{
std::vector<std::pair<float, float>> copyP = p;
std::sort( copyP.begin(), copyP.end() );
return copyP;
}
至于您的代码,lambda 表达式的参数类型不正确。P *
使用您的方法,函数的第一次调用没有意义,因为向量将在 的第二次调用中重新排序。std::sort
std::sort
你可以写
#include <tuple>
#include <vector>
#include <algorithm>
//...
std::vector<P> sortingPointsX(const std::vector<P> &p) {
std::vector<P> copyP = p;
std::sort( copyP.begin(), copyP.end(),
[]( const P &a, const P &b)
{ return std::tie( a.x, a.y ) < std::tie( b.x, b.y ); }
);
return copyP;
}
评论
(P const& a, P const& b)