c++ - 用 int 和 Points 对 vector 进行排序

标签 c++ sorting vector std-pair

我在对 vector 进行排序时遇到了一些问题。我想根据第一个元素对 vector 进行排序,其中第一个元素是数字。有人可以解释一下我做错了什么以及这 2 个错误是什么意思吗?

我尝试使用比较功能对它进行排序,但没有它,但没有任何效果。

struct Point{
    int x;
    int y;
};

bool compare(int a,int b){
     return a < b;
}

int main()
{
int N,Number,x,y;

cin >> N;
vector<pair<int,Point>> p;
for(int i = 0 ; i < N ; i++){
    cin >> Number >> x >> y;
    pair<int,Point> pom = {Number,{x,y}};
    p.push_back(pom);
    }
//    sort(p.begin(),p.end());
//    sort(p.begin().p.end(),compare);
return 0;
}

我有两个错误,但我不知道是什么意思:
1.'operator<'不匹配(操作数类型是'const Point'和'const Point')
|| (!(__y.first < __x.first) && __x.second < __y.second);
2.constexpr 函数体 'constexpr bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) [with _T1 = int; _T2 = Point]' 不是返回语句
|| (!(__y.first < __x.first) && __x.second < __y.second); } ^ ^

最佳答案

int 的比较器s 是无用的,可能是未定义的行为。编译器知道如何比较两个整数,这是语言的一部分。它还知道如何比较 std::pair 的两个实例.它不知道的是如何比较 Point 的两个实例。类,由您定义。

基本上,您有两个选择:

<强>1。提供operator<对于 Point

这将使您在以后的任何情况下都可以轻松地比较两点:

bool operator<(const Point& p1, const Point& p2) {
    if (p1.x == p2.x) 
    {
        return p1.y < p2.y;
    }
    return p1.x < p2.x;
}    

<强>2。为 std::sort 提供就地比较器 如果您只需要比较内容以进行排序,这是一个快速的解决方案。

std::sort(p.begin(), p.end(), [](const auto& p1, const auto& p2) {
    //whatever logic it takes to compare two std::pair<int, Point>
});

注意:通用 lambda(以 const auto& 作为参数)是 C++14 的一项功能。 Lambda 本身是 C++11 的特性。

以上选择取决于用途。如果您只需要对 vector 进行排序,或者排序逻辑不寻常,请使用 std::sort比较器。如果你想总是比较两个 Point以同样的方式,进行运算符重载。

关于c++ - 用 int 和 Points 对 vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56297146/

相关文章:

c++ - openGL旋转重置

c++ - 使用 STL 按列对二维数组进行排序

javascript - 使用 jQuery 按字母顺序对 div 中的文本进行排序

python - 字典排序时遇到一些麻烦

c++ - std::vector 大小在尝试填充后保持为零

c++ - 有没有更好的方法来打印最多 N 个字符的字符串?

c++ - 模板化类中模板化函数的显式实例化

c++ - 埃拉托斯特尼筛法的问题

c++ - GCC 导致 lambda 捕获的参数包出现段错误

c++ - 在字符串 vector 中查找字母数 C++