如何对C++字符串数组按字母排序及按结构体玩家名首字符排序
咱们一个个来解决你的问题:
1. 对C++字符串数组按字母顺序排序的方法
分两种常见场景来说,适配不同的字符串类型:
如果是
std::string数组:
直接用标准库的std::sort(记得包含<algorithm>头文件)就好,因为std::string已经原生支持按字典序(字母顺序)的<比较。举个兼容旧标准的示例:#include <iostream> #include <algorithm> #include <string> int main() { std::string arr[] = {"banana", "apple", "cherry", "date"}; int arr_size = sizeof(arr) / sizeof(arr[0]); // 对数组从首元素到尾后位置排序 std::sort(arr, arr + arr_size); // 遍历输出(不用C++11的范围for,兼容旧标准) for (int i = 0; i < arr_size; ++i) { std::cout << arr[i] << " "; } // 输出结果:apple banana cherry date return 0; }如果是C风格
char*数组:
不能直接用默认的std::sort(它会比较指针地址而非字符串内容),需要自定义比较函数,借助strcmp(来自<cstring>)来实现字符串内容的比较:#include <iostream> #include <algorithm> #include <cstring> // 自定义比较函数:返回负数/0/正数表示a小于/等于/大于b bool compareCStrings(const char* a, const char* b) { return strcmp(a, b) < 0; } int main() { const char* arr[] = {"banana", "apple", "cherry", "date"}; int arr_size = sizeof(arr) / sizeof(arr[0]); std::sort(arr, arr + arr_size, compareCStrings); for (int i = 0; i < arr_size; ++i) { std::cout << arr[i] << " "; } // 输出结果:apple banana cherry date return 0; }要是你更习惯C标准库的工具,也可以用
qsort来实现,写法类似。
2. 按结构体中玩家名称首字符排序的问题解决
先指出你原代码里的几个明显问题:
- 函数参数
num_players缺少类型声明,应该写成int num_players - 你创建的
sorted是字符串数组,但用sorted += ...的写法完全错误,数组不支持这种拼接操作 - 排序逻辑只简单比较了相邻元素,既没有完成完整的排序流程,还会出现数组越界(当
i = num_players-1时,i+1超出数组范围)
下面给你两种兼容旧标准的解决方案:
方案一:用std::sort+自定义比较函数(推荐,效率更高)
首先假设你的player结构体是这样的:
#include <string> struct player { std::string name; // 其他成员变量,比如分数、等级等 };
然后写一个全局的比较函数,专门用来比较两个player的名称首字符,再传给std::sort:
#include <algorithm> #include <string> struct player { std::string name; // 其他成员 }; // 自定义比较函数:按名称首字符从小到大排序,同时处理空字符串的边界情况 bool compareByFirstChar(const player& a, const player& b) { if (a.name.empty()) return true; // 空字符串优先排前面 if (b.name.empty()) return false; return a.name[0] < b.name[0]; } void sortPlayers(player* player_array, int num_players) { // 对结构体数组直接排序,不需要额外的字符串数组 std::sort(player_array, player_array + num_players, compareByFirstChar); }
方案二:手动实现冒泡排序(如果不能用标准库排序)
要是你因为某些限制不能用std::sort,可以手动实现冒泡排序,逻辑更直观:
#include <string> struct player { std::string name; // 其他成员 }; void sortPlayers(player* player_array, int num_players) { for (int i = 0; i < num_players - 1; ++i) { for (int j = 0; j < num_players - i - 1; ++j) { bool needSwap = false; // 处理空字符串的情况,避免访问越界 if (player_array[j].name.empty()) { needSwap = false; } else if (player_array[j+1].name.empty()) { needSwap = true; } else { // 比较当前元素和下一个元素的首字符 needSwap = player_array[j].name[0] > player_array[j+1].name[0]; } // 需要交换的话,互换两个结构体 if (needSwap) { player temp = player_array[j]; player_array[j] = player_array[j+1]; player_array[j+1] = temp; } } } }
两种方案都不需要C++11特性,完全兼容旧标准,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者cody parker
相关产品推荐
相关产品推荐

