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

如何根据字符串内含数字对string vector进行排序?

根据字符串中的数字对string vector排序的几种实现方案

这个需求太常见啦,我给你整理几种C++里的实用实现思路,都是项目里常用的方案,你可以根据自己的具体需求选:


方案一:提取字符串中的第一个整数作为排序依据

比如你的vector是{"abc123", "def45", "ghi6"},想按数字123、45、6的大小排序,那可以先写一个辅助函数提取每个字符串里的第一个连续数字:

#include <string>
#include <vector>
#include <algorithm>
#include <cctype>

// 从字符串中提取第一个连续整数,没找到数字就返回0(可按需调整)
int extractFirstNumber(const std::string& s) {
    std::string numStr;
    bool foundDigit = false;
    for (char c : s) {
        if (std::isdigit(c)) {
            numStr += c;
            foundDigit = true;
        } else if (foundDigit) {
            // 已经找到过数字,碰到非数字就停止提取
            break;
        }
    }
    return numStr.empty() ? 0 : std::stoi(numStr);
}

然后用这个函数配合std::sort的自定义比较器就能完成排序:

int main() {
    std::vector<std::string> vec = {"apple20", "banana5", "cherry100", "date"};
    
    // 升序排序(把<改成>就是降序)
    std::sort(vec.begin(), vec.end(), [](const std::string& a, const std::string& b) {
        return extractFirstNumber(a) < extractFirstNumber(b);
    });
    
    // 输出结果:date, banana5, apple20, cherry100
    for (const auto& str : vec) {
        std::cout << str << " ";
    }
    return 0;
}

方案二:提取字符串中所有数字拼接成整数排序

如果字符串里有多个分散的数字段,比如"a1b23c4"你想按1234这个整体数字排序,那只需要修改辅助函数,把所有数字都提取出来拼接:

int extractAllNumbers(const std::string& s) {
    std::string numStr;
    for (char c : s) {
        if (std::isdigit(c)) {
            numStr += c;
        }
    }
    return numStr.empty() ? 0 : std::stoi(numStr);
}

之后把sort里的extractFirstNumber换成这个函数就行,逻辑完全一致。


方案三:处理超大数字(避免int溢出)

如果字符串里的数字太长,超过了int甚至long long的范围,那我们可以直接用字符串来存储提取到的数字,然后自定义数字字符串的比较逻辑:

std::string extractAllNumberStr(const std::string& s) {
    std::string numStr;
    for (char c : s) {
        if (std::isdigit(c)) {
            numStr += c;
        }
    }
    return numStr;
}

// 比较两个数字字符串的大小:先比长度,长度相同再比字典序
bool compareLargeNumbers(const std::string& a, const std::string& b) {
    std::string numA = extractAllNumberStr(a);
    std::string numB = extractAllNumberStr(b);
    if (numA.size() != numB.size()) {
        return numA.size() < numB.size(); // 位数少的数字更小
    }
    return numA < numB; // 位数相同的话,字典序和数值序一致
}

// 使用时
std::sort(vec.begin(), vec.end(), compareLargeNumbers);

额外小提示

  • 如果你的需求是按数字的总和排序(比如"a1b2"按1+2=3排序),只需要修改辅助函数,把每个数字字符转成int累加就行。
  • 碰到字符串里没有数字的情况,上面的例子默认把这类字符串的排序值设为0(或空串),你可以根据需求调整,比如把无数字的放在最前面或者最后面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:08:16