学习编程中的Ben 发表于 2023-8-13 10:45:39

cmp函数报错

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int n, m, e, code, bujige = 0, shang = 0;
struct chengji{
    int s = -1;
}cj;
bool cmp(chengji a, chengji b){
    if (a.s == b.s){
      return true;
    }
    return a.s > b.s;
}
int main() {
    cin >> n >> m;
    for(int i=1;i<=n;i++){
      cin >> e;
    }
    for(int i=1;i<=m;i++){
      cin >> code;
      cin >> cj.s;
      if(cj.s < 60){
            bujige++;
      }
    }
    sort(cj, cj + m);
    for(int i=0;i<=m;i++){
      if(cj.s != -1){
            shang++;
      }else{
            break;
      }
    }
    cout << n - shang << endl << bujige;
    return 0;
}
cmp函数报错,为啥呀?

isdkz 发表于 2023-8-13 10:46:11

在这段代码中,cmp函数报错是因为它的返回类型应该是bool,但是你的cmp函数返回了true。这是不正确的。

在这里,你的cmp函数应该返回一个布尔值,表示a是否小于b。如果a小于b,返回true;如果a大于等于b,返回false。修改后的cmp函数如下所示:

bool cmp(chengji a, chengji b){
    return a.s < b.s;
}


另外,你在调用sort函数时,应该传入的是cj数组的起始位置和结束位置,而不是m。因此,你应该将 sort(cj, cj + m); 修改为 sort(cj, cj + n + 1, cmp); 。

修改后的代码如下所示:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int n, m, e, code, bujige = 0, shang = 0;
struct chengji{
    int s = -1;
}cj;
bool cmp(chengji a, chengji b){
    return a.s < b.s;
}
int main() {
    cin >> n >> m;
    for(int i=1;i<=n;i++){
      cin >> e[ i];
    }
    for(int i=1;i<=m;i++){
      cin >> code;
      cin >> cj.s;
      if(cj.s < 60){
            bujige++;
      }
    }
    sort(cj, cj + n + 1, cmp);
    for(int i=0;i<=n;i++){
      if(cj[ i].s != -1){
            shang++;
      }else{
            break;
      }
    }
    cout << n - shang << endl << bujige;
    return 0;
}


希望这可以帮助到你!

陶远航 发表于 2023-8-13 10:46:31

根据你提供的代码,cmp函数报错的原因是在使用sort函数时,无法正确地解析cmp函数。这是因为你的比较函数cmp不符合sort函数要求的格式。

在C++中,比较函数应该是一个具有两个参数并返回bool类型的函数。然而,你的cmp函数定义为bool cmp(chengji a, chengji b),其中参数类型为chengji,而不是标准的类型(例如int、float等)或其指针。

要修复这个问题,你可以将cmp函数更改为接受两个参数的指针,并修改对应的比较逻辑。修正后的代码如下:

bool cmp(const chengji* a, const chengji* b) {
    if (a->s == b->s) {
      return true;
    }
    return a->s > b->s;
}


另外,还需要将sort函数的第二个参数改为排序范围的结束位置,即cj + m改为cj + shang。修正后的代码如下:

sort(cj, cj + shang, cmp);


通过以上修改,你的代码应该能够正确编译和执行了。请注意,修改后的代码还存在其他潜在问题,如数组越界、未初始化变量等,请确保你的代码逻辑正确并做好错误处理。
如果问题已经解决,请设置最佳答案

学习编程中的Ben 发表于 2023-8-13 11:12:50

isdkz 发表于 2023-8-13 10:46
在这段代码中,cmp函数报错是因为它的返回类型应该是bool,但是你的cmp函数返回了true。这是不正确的。

...

不对啊

ba21 发表于 2023-8-13 11:32:45

sort没用对
sort(cj, cj + m, cmp);
页: [1]
查看完整版本: cmp函数报错