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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:17:54