鱼C论坛

 找回密码
 立即注册
查看: 2400|回复: 3

[已解决]关于sort()函数的一些疑惑

[复制链接]
发表于 2022-11-14 21:05:26 | 显示全部楼层 |阅读模式
20鱼币
我创建了一个结构,如下所示:
struct Student{
        char id[25];
        int M;
        int m[15];
        int score=0;
}s[1010];

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

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


最佳答案
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[15];
    int score;
} s[1314];

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[15];
    int score;

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

最佳答案

查看完整内容

用 string 吧 , 方便很多 , 至于 cin 超时的问题请看 17, 18 行是如何解决的 原理就是原来 cin 和 scanf 在同一个流 , 然后要同步 , 所以就会很慢 这里直接解绑速度就好了 , 不过这时就不能 cin 和 scanf 混用了 , 不然会出错 , 当然 , cout 和 printf 也不能一起用 也可以用重载运算符 , 就不用写 cmp' 了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[15];
    int score;
} s[1314];

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[15];
    int score;

    bool operator < (const student & t) const {
        if(score == t.score) return id < t.id;
        return score > t.score;
    }
} s[1314];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-14 22:12:07 | 显示全部楼层
个人认为 std::string 并不适合使用 scanf 进行输入,因为其内部有一些额外的状态,如果想要其正常的工作需要精确的维护这些状态,但这是非常困难的,因为内部状态可能是实现定义的。
如果必须使用 scanf ,那么使用 char 数组是比较得当的选择。比较时可以尝试使用定义在 <cstring> 中的 strcmp 函数或其变种,可能能解决您的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-14 22:27:49 | 显示全部楼层
id为啥定义成字符数组?用unsigned int不行吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 09:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表