C++中不使用数组对字符串内姓名列表按字母序排序的方法
在C++中无数组实现姓名列表排序的方案
完全可行,不用原生数组的情况下,借助C++标准库的容器和工具就能轻松实现。以下是具体实现步骤和代码示例:
步骤1:拆分字符串中的姓名列表
首先需要从输入字符串中提取出每个姓名,假设姓名之间用逗号+空格(或其他自定义分隔符)分隔,可以用std::stringstream配合std::getline完成拆分:
#include <iostream> #include <string> #include <sstream> #include <list> #include <set> int main() { std::string nameStr = "Bob, Alice, Charlie, Dave, Bob"; std::stringstream ss(nameStr); std::string name; // 方案1:用std::list存储并手动排序(支持重复姓名) std::list<std::string> nameList; while (std::getline(ss, name, ',')) { // 去除姓名前后的空格(如果有的话) size_t start = name.find_first_not_of(" "); size_t end = name.find_last_not_of(" "); if (start != std::string::npos && end != std::string::npos) { name = name.substr(start, end - start + 1); } nameList.push_back(name); } // 调用list自带的sort方法按字母顺序排序 nameList.sort(); std::cout << "排序后的姓名列表(list方案):\n"; for (const auto& n : nameList) { std::cout << n << "\n"; } // 重置stringstream,用于方案2 ss.clear(); ss.str(nameStr); // 方案2:用std::multiset自动排序(支持重复姓名,自动去重用std::set) std::multiset<std::string> nameSet; while (std::getline(ss, name, ',')) { size_t start = name.find_first_not_of(" "); size_t end = name.find_last_not_of(" "); if (start != std::string::npos && end != std::string::npos) { name = name.substr(start, end - start + 1); } nameSet.insert(name); } std::cout << "\n排序后的姓名列表(multiset方案):\n"; for (const auto& n : nameSet) { std::cout << n << "\n"; } return 0; }
关键说明
- 拆分逻辑:通过
getline(ss, name, ',')按逗号拆分字符串,额外处理空格是为了避免姓名前后的空白字符影响排序。 - list方案:
std::list是双向链表,不属于数组结构,自带的sort()方法会直接对链表元素进行字典序排序(默认按std::less<std::string>规则,即字母顺序)。 - multiset方案:
std::multiset是有序关联容器,插入元素时会自动按字母顺序排列,且允许重复元素;如果不需要重复姓名,换成std::set即可自动去重并排序。 - 两种方案都完全不需要使用原生数组(如
std::string arr[]),全程依赖标准库容器完成存储和排序。
内容的提问来源于stack exchange,提问作者Jojo
相关产品推荐
相关产品推荐

