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
相关产品推荐
相关产品推荐

