如何用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
相关产品推荐
相关产品推荐

