使用点 (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'

提问人:Polynomial length of study 提问时间:10/7/2021 最后编辑:Vlad from MoscowPolynomial length of study 更新时间:10/7/2021 访问量:39

问:

我尝试对带有点(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
}
C++ 排序 向量 std-pair

评论

1赞 fabian 10/7/2021
比较函数采用对元素的引用,而不是指针。将 lambda 的参数更改为(P const& a, P const& b)

答:

2赞 Vlad from Moscow 10/7/2021 #1

对于初学者,而不是你自己的类,你可以使用标头中声明的标准类模板,因为已经为这个类模板定义了。struct Pstd::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::sortstd::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;
}