【问题标题】:How myCompare function is working in vector pair sort?myCompare() 函数如何在 C++ 程序中工作?
【发布时间】:2022-08-13 20:43:18
【问题描述】:

myCompare() 函数是如何工作的?比如什么是p1,什么是p2?我想知道函数中发生了什么(比如调试)。

#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
using namespace std;

bool myCompare(pair<int, int> p1, pair<int, int> p2){
    return p1.first<p2.first;
}

int main(){
    int arr[]={10,16,7,14,5,3,12,9};
 
    vector <pair <int, int>> v;

    for(int i=0;i<(sizeof(arr)/sizeof(arr[0]));i++){
        v.push_back(make_pair(arr[i],i));
    }
    for(auto a:v){
        cout<<a.first<<\" \"<<a.second<<\"    \";
    }cout<<endl;

    sort(v.begin(),v.end(),myCompare);

    for(auto a:v){
        cout<<a.first<<\" \"<<a.second<<\"    \";
    }cout<<endl;
}
  • 您有明确声明的类型。对于任何排序功能,您都需要某种方法来比较两个元素以了解排序应该采用的顺序,这正是您的 myCompare 所做的
  • 您编写了函数并将其作为自定义比较器发送到std::sort,但不知道它是如何/为什么工作的?嗯...

标签: c++ function sorting


【解决方案1】:

排序函数通常会进行一系列比较以构建给定元素的排序范围。为了比较,您可以使用小于或大于运算符进行升序或降序。您还可以定义和使用完全唯一的比较运算符来解释您的数据类型,只要它满足Compare 的要求。

比较函数定义类型的排序。它需要两个元素作为输入,并返回一个布尔值。比较函数 comp 必须满足一些规则才能定义有意义的排序(并且没有 UB),例如:

For all a, comp(a,a)==false
If comp(a,b)==true then comp(b,a)==false
if comp(a,b)==true and comp(b,c)==true then comp(a,c)==true

在您的示例中,v 使用定义为类型pair&lt;int, int&gt; 的比较运算符的myCompare 函数进行排序。 myCompare 只考虑对的第一个元素,这是完全有效的,并且满足 Compare 的所有规则。

【讨论】:

    【解决方案2】:

    简短的回答是:

    1. myCompare 告诉 std::sort 函数如何对整数对进行排序。
    2. p1p2 是要比较的整数对。

      想想看。如果您有 2 对整数,例如 {10, 4} 和 {20, 2},您怎么知道如何对它们进行排序?

      • 应该因为 10 < 20 而先出现 {10, 4} 吗?
      • 是否应该因为 2 < 4 而先出现 {20, 2}?
      • 也许您想在比较中使用这两个值,例如 (10/4) < (20/2)?

      myCompare 函数简单描述了应该使用第一种比较方法,只考虑每对的第一个值。

      因此,在此示例中,p1 是 {10, 4},p2 是 {20, 2},myCompare 将订购它们 p1, p2,因为 10 < 20。

      在您的main() 函数中,myCompare 将被多次调用,而std::sort 对您的向量进行排序并传入 2 个整数对(如p1p2),此时它正在比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多