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

如何用C++ STL算法基于年龄排序含姓名与年龄的字符串

按字符串中的年龄排序vector的问题解决

你的代码没法正确按年龄排序,核心问题是当前的lambda表达式直接比较整个字符串的字典序,而不是提取字符串里的年龄数值来做比较。比如遇到"Bob 99"和"Alice 100"时,字符串比较会把"Bob"排在前面,但实际年龄100更大,结果就完全错了。

要解决这个问题,我们需要在排序的自定义比较逻辑里,先从每个字符串中提取出年龄部分,转成整数后再比较。这个过程不需要循环,完全用STL方法和lambda就能实现:

#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

vector<string> SortedByAge(vector<string> unsorted)
{
    sort(unsorted.begin(), unsorted.end(), [](const string& a, const string& b) {
        // 提取第一个字符串的年龄
        size_t spaceA = a.find(' ');
        int ageA = stoi(a.substr(spaceA + 1));
        // 提取第二个字符串的年龄
        size_t spaceB = b.find(' ');
        int ageB = stoi(b.substr(spaceB + 1));
        // 按年龄降序排序,要升序就改成 ageA < ageB
        return ageA > ageB;
    });
    return unsorted;
}

int main()
{
    vector<string> result = SortedByAge({"Josh 67", "Emily 42", "Rich 14", "Janet 1"});
    for(auto x : result)
    {
        cout << x << endl;
    }
}

关键改动说明:

  • 把比较lambda直接内联到sort调用里,同时用const string&作为参数,避免多余的字符串拷贝,提升效率。
  • 通过string::find定位空格位置,用substr截取空格后的年龄子串,再用stoi转成整数。
  • 直接比较转换后的年龄数值,确保排序逻辑完全基于年龄,而不是字符串的字典顺序。
  • 如果需要升序排序,只需要把return ageA > ageB改成return ageA < ageB就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:10:34