技术求助:找出Map中对应最多名字的姓氏并输出其名字集合
解决思路与代码修改方案
我来帮你搞定这个问题!其实思路很简单,分两步走就能实现需求:
- 第一步:确定最大名字数量:先遍历整个
map,记录下所有姓氏中对应的名字集合的最大大小 - 第二步:筛选并输出目标内容:再次遍历
map,找出所有名字集合大小等于最大值的姓氏,然后输出对应的名字列表
下面是补全并修改后的完整代码,你可以直接参考:
#include <stdio.h> #include <iostream> #include <string> #include <set> #include <map> using namespace std; typedef set<string> fnset; int main() { map<string, fnset*> lnames; // 这里可以替换成你自己的输入逻辑,比如从文件或控制台读取数据 // 示例数据填充 lnames["Smith"] = new fnset({"John", "Jane", "Bob"}); lnames["Johnson"] = new fnset({"Alice", "Mike"}); lnames["Williams"] = new fnset({"David", "Emma", "Olivia"}); // 第一步:找出名字集合的最大数量 size_t max_name_count = 0; for (const auto& entry : lnames) { if (entry.second->size() > max_name_count) { max_name_count = entry.second->size(); } } // 第二步:输出所有拥有最多名字的姓氏及对应名字 cout << "拥有最多名字的姓氏及名字:" << endl; for (const auto& entry : lnames) { if (entry.second->size() == max_name_count) { cout << "* 姓氏:" << entry.first << endl; cout << " 名字:"; bool is_first = true; for (const string& name : *entry.second) { if (!is_first) { cout << ", "; } cout << name; is_first = false; } cout << endl; } } // 释放动态分配的内存,避免内存泄漏 for (auto& entry : lnames) { delete entry.second; } lnames.clear(); return 0; }
关键点说明
- 用
size_t类型存储最大数量,因为set::size()返回的是无符号整数,类型匹配更安全 - 两次遍历的逻辑清晰:第一次只统计最大值,第二次精准筛选目标条目
- 记得释放
fnset的内存,因为你使用了动态分配的指针,避免内存泄漏 - 如果有多个姓氏拥有相同的最大名字数量,代码会把它们全部输出,不会遗漏
内容的提问来源于stack exchange,提问作者jordan neely
相关产品推荐
相关产品推荐

