You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ 兼容全版本的二维字符串数组按首列降序排序实现问题

C++ 二维字符串数组按首列数字降序排序实现方案

完全兼容所有C版本,无需转换为vector或其他类型,直接使用C标准库函数实现。

核心思路

使用标准库qsort函数实现行粒度排序,仅交换每行的指针值,不修改原始字符串数据,性能开销极低。

代码实现

1. 依赖头文件

#include <stdlib.h>
#include <stdio.h>

两个头文件为所有C++版本标准自带,无需额外依赖。

2. 定义比较函数

将Y替换为你实际的列数即可:

// 定义固定列数
#define Y 5

int compareRow(const void* a, const void* b) {
    // 转换指针类型为 包含Y个const char*的行指针
    const char* (*rowA)[Y] = (const char* (*)[Y])a;
    const char* (*rowB)[Y] = (const char* (*)[Y])b;
    
    // 取首列得分转整数比较
    int scoreA = atoi((*rowA)[0]);
    int scoreB = atoi((*rowB)[0]);
    
    // 降序排序规则
    return scoreB - scoreA;
}

如果你的得分数值超出int范围,可替换atoi为atol转long类型比较即可。

3. 调用排序

假设X为你读取得到的实际有效行数,Table为你构建的二维字符串数组:

qsort(Table, X, sizeof(Table[0]), compareRow);

4. 输出前10名

排序完成后直接遍历输出即可:

int outputNum = X < 10 ? X : 10;
for(int i = 0; i < outputNum; i++) {
    // 可替换为你需要的输出格式,写文件用fprintf即可
    printf("%s | %s | %s | %s | %s\n", Table[i][0], Table[i][1], Table[i][2], Table[i][3], Table[i][4]);
}

注意事项

  • 只要你存储原始内容的string对象在排序、输出全程没有被销毁或修改,Table中存储的data()指针就始终有效,排序过程仅交换指针值,不会改动原始数据。
  • 如果你是用二级指针对Table做动态分配(每行单独申请内存),只需调整比较函数的指针转换逻辑即可:
// 二级指针分配的Table对应的比较函数
int compareRowDynamic(const void* a, const void* b) {
    const char** rowA = *(const char***)a;
    const char** rowB = *(const char***)b;
    int scoreA = atoi(rowA[0]);
    int scoreB = atoi(rowB[0]);
    return scoreB - scoreA;
}
// 对应的qsort调用
qsort(Table, X, sizeof(const char**), compareRowDynamic);

内容的提问来源于stack exchange,提问作者l Demut l

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 16:15:04