C++自定义排序:数组添加电影标题时自动按字母/数字排序求助
解决你的有序列表字符串排序问题
嘿,我明白你的需求啦——给大学项目做一个能自动按字母数字排序的电影列表,现在数字的排序没问题,但字符串的Add函数卡壳了,还得让第三个输入能插到排序后的首位对吧?咱们一步步来解决。
首先,先理清楚核心问题:字符串的字母数字自然排序和纯数字排序逻辑不一样,你之前的代码可能只适配了数字,现在要改成针对字符串的比较规则。下面给你两种可行的方案,按需选择就行。
方案一:用标准库std::sort快速实现
如果你不想手动写排序逻辑,直接用C++标准库的sort函数最省心,只需要定义一个字符串比较规则:
#include "stdafx.h" #include <iostream> #include <string> #include <algorithm> const int MAX_SIZE = 100; std::string movieTitles[MAX_SIZE]; int currentCount = 0; // 自定义比较函数:实现字母数字顺序排序 // 想要不区分大小写排序的话,把注释的代码打开即可 bool compareTitles(const std::string& a, const std::string& b) { // std::string aLower = a; // std::string bLower = b; // std::transform(a.begin(), a.end(), aLower.begin(), ::tolower); // std::transform(b.begin(), b.end(), bLower.begin(), ::tolower); // return aLower < bLower; return a < b; // 默认区分大小写,数字会排在字母前面 } void Add(std::string title) { if (currentCount >= MAX_SIZE) { std::cout << "列表已满,没法添加更多电影啦!" << std::endl; return; } // 先把新标题加到数组末尾 movieTitles[currentCount] = title; currentCount++; // 对现有所有元素按规则排序 std::sort(movieTitles, movieTitles + currentCount, compareTitles); } // 打印列表用于测试 void PrintMovieList() { std::cout << "排序后的电影列表:\n"; for (int i = 0; i < currentCount; i++) { std::cout << i+1 << ". " << movieTitles[i] << "\n"; } } int main() { Add("Zootopia"); Add("Avengers"); Add("12 Monkeys"); // 这个会自动排到首位,因为数字ASCII码比字母小 PrintMovieList(); return 0; }
方案二:手动实现插入排序(更高效)
如果列表元素较多,每次全量排序有点浪费性能,不如用插入排序——找到新元素的正确位置,把后面的元素后移,再插入新元素:
#include "stdafx.h" #include <iostream> #include <string> const int MAX_SIZE = 100; std::string movieTitles[MAX_SIZE]; int currentCount = 0; bool compareTitles(const std::string& a, const std::string& b) { return a < b; // 同样可以改成不区分大小写的版本 } void Add(std::string title) { if (currentCount >= MAX_SIZE) { std::cout << "列表已满,没法添加更多电影啦!" << std::endl; return; } // 找到插入位置:第一个比新标题大的元素的索引 int insertPos = 0; while (insertPos < currentCount && compareTitles(movieTitles[insertPos], title)) { insertPos++; } // 把插入位置及后面的元素往后挪一位 for (int i = currentCount; i > insertPos; i--) { movieTitles[i] = movieTitles[i-1]; } // 插入新标题 movieTitles[insertPos] = title; currentCount++; } // 打印列表用于测试 void PrintMovieList() { std::cout << "排序后的电影列表:\n"; for (int i = 0; i < currentCount; i++) { std::cout << i+1 << ". " << movieTitles[i] << "\n"; } } int main() { Add("Zootopia"); Add("Avengers"); Add("12 Monkeys"); // 直接插到排序后的首位 PrintMovieList(); return 0; }
关键说明
- 两种方案都能让数字开头的标题(比如"12 Monkeys")排在字母开头的前面,因为ASCII编码里数字的数值比字母小,
a < b的比较逻辑会自动把它放到首位。 - 如果需要不区分大小写的排序,只要把
compareTitles函数里的注释代码打开,转成小写再比较就行。 - 插入排序的方案更适合频繁添加元素的场景,因为它只移动必要的元素,比全量排序效率更高。
内容的提问来源于stack exchange,提问作者ESuth
相关产品推荐
相关产品推荐

