桃亭侠客 发表于 2022-11-14 21:05:26

关于sort()函数的一些疑惑

我创建了一个结构,如下所示:
struct Student{
      char id;
      int M;
      int m;
      int score=0;
}s;

我想实现用sort()函数根据规则(规则1:分数降序输出。规则2:若分数相同则按他们考号的升序输出。)对s进行排序。

下面代码是我之前写的,发现输出的结果不尽人意{:10_266:},因为输入的数据过大,为了避免超时我又不得不使用scanf,但是用scanf输入std::string类型又不知道怎么输入(在网上也找了很久,没看到一个比较好解释怎么输入的),所以定义了字符串数组。但是定义了字符串数组后,sort排序的规则又不好编写{:10_266:}。

bool cmp(Student a,Student b){
      if(a.score == b.score)
                return a.id < b.id;
      return a.score > b.score;
}

sort(s1, s1+N,cmp);
来个大佬救救我吧{:10_266:}


柿子饼同学 发表于 2022-11-14 21:05:27

本帖最后由 柿子饼同学 于 2022-11-14 22:48 编辑

用 string 吧 , 方便很多 , 至于 cin 超时的问题请看 17, 18 行是如何解决的
原理就是原来 cin 和 scanf 在同一个流 , 然后要同步 , 所以就会很慢
这里直接解绑速度就好了 , 不过这时就不能 cin 和 scanf 混用了 , 不然会出错 , 当然 , cout 和 printf 也不能一起用
#include <bits/stdc++.h>
using namespace std;

struct student{
    string id;
    int M;
    int m;
    int score;
} s;

inline bool cmp(student a, student b){
    if(a.score == b.score) return a.id < b.id;
    return a.score > b.score;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
   
    return 0;
}
也可以用重载运算符 , 就不用写 cmp' 了
struct student{
    string id;
    int M;
    int m;
    int score;

    bool operator < (const student & t) const {
      if(score == t.score) return id < t.id;
      return score > t.score;
    }
} s;

dolly_yos2 发表于 2022-11-14 22:12:07

个人认为 std::string 并不适合使用 scanf 进行输入,因为其内部有一些额外的状态,如果想要其正常的工作需要精确的维护这些状态,但这是非常困难的,因为内部状态可能是实现定义的。
如果必须使用 scanf ,那么使用 char 数组是比较得当的选择。比较时可以尝试使用定义在 <cstring> 中的 strcmp 函数或其变种,可能能解决您的问题。

jhq999 发表于 2022-11-14 22:27:49

id为啥定义成字符数组?用unsigned int不行吗?
页: [1]
查看完整版本: 关于sort()函数的一些疑惑