如何根据字符串内含数字对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
相关产品推荐
相关产品推荐

